在 C 中,SFINAE(替换失败不是错误)允许您根据模板参数的类型启用或禁用代码。然而,在处理类模板的成员函数时,SFINAE 通常无法按预期工作。
下面是演示该问题的示例:
#include
struct A {};
struct B {};
template
struct Foo
{
typename std::enable_if<:is_same a>::value>::type bar()
{}
typename std::enable_if<:is_same b>::value>::type bar()
{}
};
在这个例子中,Foo定义了两个重载成员函数bar()。当 T 为 A 时启用第一个重载,当 T 为 B 时启用第二个重载。但是,如果您尝试编译此代码,您将收到一条错误消息,指示无法解析重载。
出现此错误的原因是 SFINAE 仅适用于 推导的 模板参数。对于类模板的成员函数,模板参数不是推导的,而是显式指定的。要解决此问题,您可以使用以下技术之一:
使用显式模板参数:
struct Foo
{
void bar(A) {}
void bar(B) {}
};
在成员函数中使用 std::enable_if:
template
struct Foo
{
template
typename std::enable_if<:is_same a>::value>::type bar() {}
template
typename std::enable_if<:is_same b>::value>::type bar() {}
};
使用显式类模板专门化:
template struct Foo { void bar() {} };
template struct Foo { void bar() {} };
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3