2017-05-25 35 views
2

你知道模板參數可能是類型或積分值, 因此,例如,你可以有是否可以編寫適用於所有整型的類模板?

template<typename T, size_t BufferSize> 
small_vector { 
//... 

問題我已經是我想寫的模板,將不同類型的整體工作。

因此,像這樣:

constexpr short sa=1, sb=2, sc=3; 
my_template_class1<sa,sb,sc>; 
constexpr int ia=1, ib=2, ic=3; 
my_template_class2<ia,ib,ic>; 

換句話說,我知道模板類型參數可以是int,我要的是有一個模板,將與所有整數類型整數模板參數工作。 請注意,我不能只在int64中執行所有計算,因爲它不適用於uint64。

+4

你有沒有試過'template '? –

+3

C++ 17將允許你有'template ' – NathanOliver

+0

W.F.我結束了使用,我希望它可以推斷'a','b','c'的類型,所以我不需要寫char,'a','b','c',但我想這是不可能的。隨時將您的評論發送到A,我會接受。 – NoSenseEtAl

回答

-2

通常通過添加額外的「啓用」模板參數實現這一點:

// the partial specialization of A is enabled via a template parameter 
template<class T, typename BufferSize, class Enable = void> 
class small_vector {}; // primary template, not used 

template<class T, typename BufferSize> 
class small_vector<class T, typename BufferSize, typename std::enable_if<std::is_integral<BufferSize>::value>::type> { 
}; // specialization for various int types 

說了這麼多,我建議不要把各種BUFFERSIZE實現多大的努力。它們很可能在編譯時使用,只消耗內存或CPU。

+1

這裏的問題是這裏的BufferSize是int/size_t/short ...但它不能是5,66,11,這就是我想要的。 – NoSenseEtAl

+0

然後,你必須定義一個元編程函子,它將「啓用」所有好的值並禁用所有不良值。庫boost :: mpl有很多功能。您的自定義啓動器實際上將是一個模板類,您將在上面的代碼中使用它,而不是'enable_if ' –

0

我想你對一個僅適用於整型類型的模板感興趣。你要找的是std::enable_if。通過使用這個,如果你嘗試使用除整型之外的任何東西來創建它,模板將會引發編譯錯誤。它也適用於任何和所有整型。

#include <iostream> 
#include <type_traits> 

// 1. the return type (bool) is only valid if T is an integral type: 
template <class T> 
typename std::enable_if<std::is_integral<T>::value,bool>::type 
    is_odd (T i) {return bool(i%2);} 

// 2. the second template argument is only valid if T is an integral type: 
template < class T, 
      class = typename std::enable_if<std::is_integral<T>::value>::type> 
bool is_even (T i) {return !bool(i%2);} 

int main() { 

    short int i = 1; // code does not compile if type of i is not integral 

    std::cout << std::boolalpha; 
    std::cout << "i is odd: " << is_odd(i) << std::endl; 
    std::cout << "i is even: " << is_even(i) << std::endl; 

    return 0; 
} 
+0

正如另一個答案中所述,我不想將T限制爲整數類型,I希望啓用積分模板參數,而無需明確說明size_t,int,... – NoSenseEtAl

相關問題