这真的很简单。请记住使用默认为 class/struct 模板参数的另一个模板参数。
假设您想要一个具有两个成员 void foo<T>::bar1 (int) 和 int foo<T>::bar2 () 的类 foo<T>,并假设您希望仅当 T 不同于 long 时才实现 bar1() 和 bar2()。
你可以这样做
#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测试如下
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; }
如果你可以使用 C++14 编译器,使用 std::enable_if_t 你可以避免一对 typename 和一对 if ::type 并将代码简化如下
template <typename U = T>
std::enable_if_t<sizeof(U) && (false == std::is_same<T, long>::value)>
bar1 (int)
{ }
template <typename U = T>
std::enable_if_t<sizeof(U) && (false == std::is_same<T, long>::value), int>
bar2 ()
{ return 0; }