2017-03-27 105 views
0

這似乎是一個簡單的類成員funrtion,但我有與std::enable_if如何禁用某些模板類型

語法的情況其實是很簡單的一些困難。

模板類與模板參數,其將不對一種特定類型的T來實現T

2的功能。

兩個函數沒有參數或返回值的T

一個函數接受一個int,另一個函數返回一個int

任何簡單的例子?

或者是否有另一個選項(C++ 11)不使用std::enable_if

回答

1

這很簡單。只記得使用缺省類型/結構模板參數的另一個模板參數。

假設你想一類foo<T>有兩個成員,void foo<T>::bar1 (int)int foo<T>::bar2()並假設你想要的bar1()bar2()實現只有Tlong不同。

你可以做如下

#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; } 
+1

由於它完全沒有whant我想要的。但我仍然缺乏一些理解。爲什麼不能直接使用'T'而不是'U'; ?第二個例子sizeof(U)怎麼會得到0? – Waldorf