如何从重载决策中删除重载函数?
How to delete a overload function from overload resolution?
假设我有一个 class 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"; }
};
这不会让两个重载参与并在选择错误的重载时导致错误,而是会从上下文中推断出目标类型,然后决定是否应该从重载决议中删除重载。单次重载不会有歧义。
假设我有一个 class 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"; }
};
这不会让两个重载参与并在选择错误的重载时导致错误,而是会从上下文中推断出目标类型,然后决定是否应该从重载决议中删除重载。单次重载不会有歧义。