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