[英]Can I get rid of template specialisation with std::enable_if?
我讀到了std::enable_if
:
基於類型的任意屬性的函數重載
所以我試圖通過enable_if
(如下所示)重載類ctors但是我得到錯誤,說當使用std::enable_if
時, enable_if
不能用於禁用聲明和這兩行:
#include <iostream>
#include <type_traits>
#include <typeinfo>
template <typename T>
class cls
{
public:
cls (T a, typename std::enable_if< std::is_same<T, int>::value >::type * Dummy = 0)
{
std::cout << "Ctor for int\n";
}
cls (T a, typename std::enable_if< std::is_same<T, char>::value >::type * Dummy = 0)
{
std::cout << "Ctor for char\n";
}
};
int main()
{
cls a(10);
cls b('x');
return 0;
}
因此可以使用enbale_if
重載enbale_if
。
問題是,例如,當您實例化cls<int>
,您將始終從第二個構造函數overloaing獲得失敗的需求,即std::enable_if< std::is_same<T, char>::value >::type
T
是int
。 cls<char>
。
您可以制作構造函數模板以使SFINAE生效; 這將從重載集中刪除模板特化,並且不會導致編譯錯誤。 例如
template <typename X = T>
cls (X a, typename std::enable_if< std::is_same<X, int>::value >::type * Dummy = 0)
{
std::cout << "Ctor for int\n";
}
template <typename X = T>
cls (X a, typename std::enable_if< std::is_same<X, char>::value >::type * Dummy = 0)
{
std::cout << "Ctor for char\n";
}
你似乎不需要這里的enable_if
,只是一個常規的構造函數:
cls(T a) { std::cout << "Ctor for T\n"; }
要禁用模板類專門化,請不要提供其定義:
template<> class cls<void>; // disabled specialization.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.