如何禁用某些模板类型的类成员函数

时间:2017-03-27 16:36:45

标签: c++ c++11 templates sfinae enable-if

这似乎很简单,但我对std::enable_if

的语法有些困难

情况实际上非常简单。

包含模板参数T

的模板类

对于一种特定类型的T,不应实施2个函数。

这两个函数都没有参数或返回值T

一个函数接受int,另一个函数返回int

任何简单的例子?

或者是否有其他选项(C ++ 11)不使用std::enable_if

1 个答案:

答案 0 :(得分:3)

这很简单。只需记住使用另一个默认为类/结构模板参数的模板参数。

假设您想要一个包含两个成员foo<T>void foo<T>::bar1 (int)的成员int foo<T>::bar2 (),并且假设您希望仅在bar1()bar2() { {1}}与T不同。

您可以执行以下操作

long

存在危险:有人可以绕过您的控制并明确#include <type_traits> template <typename T> struct foo { template <typename U = T> typename std::enable_if<false == std::is_same<U, long>::value>::type bar1 (int) { } template <typename U = T> typename std::enable_if<false == std::is_same<U, long>::value, int>::type bar2 () { return 0; } }; int main() { foo<int> fi; foo<long> fl; fi.bar1(0); // compile fi.bar2(); // compile // fl.bar1(0); // compilation error // fl.bar2(); // compilation error } 类型,如下所示

U

要避免此问题,您可以按照以下方式改进foo<long> fl; fl.bar1<long long>(0); 测试

std::enable_if

如果您可以使用C ++ 14编译器,使用 template <typename U = T> typename std::enable_if <sizeof(U) && (false == std::is_same<T, long>::value)>::type bar1 (int) { } template <typename U = T> typename std::enable_if <sizeof(U) && (false == std::is_same<T, long>::value), int>::type bar2 () { return 0; } ,可以避免使用std::enable_if_ttypename几个,并按如下方式对代码进行简化

::type