0
这似乎是一个简单的类成员funrtion,但我有与std::enable_if
如何禁用某些模板类型
语法的情况其实是很简单的一些困难。
模板类与模板参数,其将不对一种特定类型的T
来实现T
2的功能。
两个函数没有参数或返回值的T
一个函数接受一个int
,另一个函数返回一个int
。
任何简单的例子?
或者是否有另一个选项(C++ 11)不使用std::enable_if
?
这似乎是一个简单的类成员funrtion,但我有与std::enable_if
如何禁用某些模板类型
语法的情况其实是很简单的一些困难。
模板类与模板参数,其将不对一种特定类型的T
来实现T
2的功能。
两个函数没有参数或返回值的T
一个函数接受一个int
,另一个函数返回一个int
。
任何简单的例子?
或者是否有另一个选项(C++ 11)不使用std::enable_if
?
这很简单。只记得使用缺省类型/结构模板参数的另一个模板参数。
假设你想一类foo<T>
有两个成员,void foo<T>::bar1 (int)
和int foo<T>::bar2()
并假设你想要的bar1()
和bar2()
实现只有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
测试如下
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一个使用C++编译器14,使用std::enable_if_t
可避免一对夫妇的typename
和一对夫妇如果::type
和semplify代码如下
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; }
由于它完全没有whant我想要的。但我仍然缺乏一些理解。为什么不能直接使用'T'而不是'U';?第二个例子sizeof(U)怎么会得到0? –
Waldorf