c++ - 当多个重载超过 SFINAE 时创建首选重载
问题描述
struct A { void a() { puts("a"); } };
struct B { void b() { puts("b"); } };
struct C : A, B {};
template <typename T> decltype(&T::a, (void)0) SFINAE(T t) { t.a(); }
template <typename T> decltype(&T::b, (void)0) SFINAE(T t) { t.b(); }
int foo()
{
SFINAE(A{}); // works fine, calls a
SFINAE(B{}); // works fine, calls b
SFINAE(C{}); // compile error
}
上面的代码在使用具有a
and的类型调用 SFINAE 时失败b
,因此使两个模板都有效,从而导致模棱两可的调用。如何修复上述代码以在模棱两可的情况下更喜欢第一个重载?所以SFINAE(C{})
应该调用a
。
解决方案
您可以通过引入转换来消除呼叫歧义:
template <typename T> decltype(&T::a, (void)0) impl(T t, int) { t.a(); }
template <typename T> decltype(&T::b, (void)0) impl(T t, unsigned) { t.b(); }
template <typename T> void SFINAE(T && t) { impl(std::forward<T>(t), 42); }
传递42
type int
,编译器将选择第一个重载作为更好的匹配。
推荐阅读
- c++ - 如何在 C++ 中逐字符读取字符串?
- unix - 非标准文件描述符没有输出
- laravel-5.8 - 如何设置默认值 Laravel
- python - Kubernetes POD 重启
- python - qqplot:我应该使用什么参数来绘制参考线?
- python-3.x - appium没有在密码字段Python上键入密钥
- twig - Twig negate 以
- php - 如何在 PHP 中成功发布数据?未定义变量:check.php 中的 name_result
- cryptography - 对 RootCA 和 SubCA 使用相同的私钥是否有效?
- google-apps-script - Google 脚本编辑器在值插入或更改时发送电子邮件