这似乎很简单,但我对std::enable_if
情况实际上非常简单。
包含模板参数T
对于一种特定类型的T
,不应实施2个函数。
这两个函数都没有参数或返回值T
一个函数接受int
,另一个函数返回int
。
任何简单的例子?
或者是否有其他选项(C ++ 11)不使用std::enable_if
?
答案 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_t
和typename
几个,并按如下方式对代码进行简化
::type