SFINAE 类模板成员函数失败
替换失败,不是错误 (SFINAE) 机制,常用于模板元编程,当应用于类模板成员函数时,似乎表现出特殊的行为。
问题
考虑以下代码片段:
<code class="cpp">#include <type_traits> struct A{}; struct B{}; template <typename T> struct Foo { // Conditional enable bar() for T == A typename std::enable_if<std::is_same<T, A>::value>::type bar() {} // Conditional enable bar() for T == B typename std::enable_if<std::is_same<T, B>::value>::type bar() {} };</code>
此代码尝试在 Foo 类模板中定义 bar() 的两个重载,并使用 SFINAE 根据 T 的值有条件地启用每个重载。但是,代码无法编译,并出现以下错误:
<code class="cpp">error: 'typename std::enable_if<std::is_same<T, B>::value>::type Foo<T>::bar()' cannot be overloaded</code>
说明
SFINAE 通常用于启用或禁用基于模板参数的模板专业化。但是,SFINAE 仅适用于 推导的 模板参数,这意味着在重载解析期间自动推导的参数。对于成员函数,模板参数不是推导的,而是在实例化类时显式指定的。因此,SFINAE 不适用于成员函数。
解决方案
解决这个问题主要有两种方法:
<code class="cpp">template <typename T> void bar(Foo<T><- A) {} template <typename T> void bar(Foo<T><- B) {}
<code class="cpp">template <typename> struct Foo; template <> struct Foo<A> { void bar() {} }; template <> struct Foo<B> { void bar() {} };</code>
以上是为什么 SFINAE 对于类模板成员函数失败?的详细内容。更多信息请关注PHP中文网其他相关文章!