SFINAE:它如何与派生类一起工作?
SFINAE: How it works with derived class?
我写了以下代码:
template <typename Type>
class Int {
public:
int value;
};
template <typename Type>
class Class : public Int<Type> {};
int var;
template <typename Type>
void foo(Type newValue) {
var = newValue;
}
template <typename ClassType>
void foo(Int<ClassType>& newValue) {
var = newValue.value;
}
int main() {
Class<int> c;
foo(c);
}
我有编译错误,因为编译器尝试调用foo
的第一个实现(如果我尝试删除它,代码可以正确编译(。编译器不是应该使用第二个实现吗,因为 SFINAE?
这里没有使用SFINAE。选择第一个foo
重载是因为它产生比另一个更好的匹配(匹配是精确的,而不是另一个(。您可以尝试通过此处了解有关SFINAE的更多信息,我还建议您观看这个很棒的演讲以学习如何正确操作(演讲更高级(。
SFINAE 的意思是,在推断模板中的类型时,你会想出格式错误的代码,只要匹配某些内容就无关紧要。在您的情况下,两个模板都匹配,因此适用正常的解析规则。精简模板后,您的代码归结为:
struct Base { int value; }
struct Derived : public Base {};
int var;
void foo(Derived val) { var = val; }
void foo(const Base& val) { var = val.value; }
int main()
{
Derived bar;
bar.value = 3;
foo(bar); // will try to call first foo and compilation will fail
}
相关文章:
- 如何使我的 sizeof sum 结构与空参数包一起工作
- SFINAE:它如何与派生类一起工作?
- std::remove() 按预期处理文字,但不能与取消引用的迭代器一起工作
- 尝试让条形码扫描仪与Arduino一起工作
- 从书本中学习C++无法使该程序与类一起工作
- 让类与运算符一起工作更简单的方法
- 如何使lambda与std::nullopt一起工作
- 当我使用长整型时,我的代码不起作用,它与 int 一起工作得很好
- 返回对象如何与分配运算符一起工作
- GLM :: perspective()和glm :: lookat()一起工作
- SFML OpenGL:如何同时与他们一起工作
- 使QTConcurrent ::映射与Lambdas一起工作
- 如何与C 字符串中的非ASCII字符一起工作
- 我如何适应擦除式习惯与矢量元组一起工作
- 需要帮助使 VOID 代码与总工资一起工作
- 我怎样才能让这个刽子手代码与 wxDev-C++ 一起工作
- Googletest 在 bazel test 中永远不会失败(在它应该失败的地方),但与 cmake & clion 一起工作
- 常量变量初始化仅与成员初始化列表一起工作
- feal_ptr与unique_ptr一起工作
- OpenGL Ping Pong可与一张通行证一起工作,而不是两个通行证