假设我有一个类stest
,我希望它能够隐式强制转换为char const*
,而不是bool
。
struct STest {
operator char const*() const& { return "abc"; }
operator bool() const& = delete;
};
void bar(bool) {}
void foo(bool) {}
void foo(char const*) {}
此实现在调用bar(STest{})
时按预期工作(错误)。 但是它对foo(STest{})
不起作用,因为在重载解析中也考虑了已删除的函数,并且它抱怨二义性。 是否有一种方法可以解决这一问题,即bar(STest{})
引发错误并foo(STest{})
调用foo(char const*)
?
您可以使用转换运算符模板,并用SFINAE约束它。
struct STest {
template<typename T, std::enable_if_t<std::is_same<char const*, T>::value, int> = 0>
operator T() const& { return "abc"; }
};
这不会让两个重载参与进来并在选择错误的重载时导致错误,而是从上下文推导目标类型,然后决定是否应该从重载解析中删除重载。 使用一个重载就不会有歧义。