簡體   English   中英

我可以用std :: enable_if擺脫模板專業化嗎?

[英]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 Tint 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM