2016-11-24 75 views
1

說我有一個整型模板參數的類。我將如何去添加一個函數,該函數需要給定類型的參數N?如果可能的話,我想避免enable_if等等。函數自變量的數量等於模板整數

我目前做的是:

template<unsigned int N> 
class Foo 
{ 
    template <typename To, typename> 
    using to = To; 
public: 
    template<typename... Args> 
    void Bar(to<char, Args>... args) // Some arguments of type char 
    { /* do stuff */ } 
}; 

這允許調用酒吧:

Foo<3> myfoo; 
myfoo.Bar<int, int, int>('a', 'b', 'c'); 

但是,我看到兩個缺點。首先,參數的數量不一定限於N,除非可能代碼在Bar之內。

其次,用戶需要爲該函數添加模板參數。它們的值實際上並不使用,只有參數的數量。這似乎是不必要的,因爲我們已經有這個,即N

的最佳使用功能是這樣的:

Foo<3> myfoo; 
myfoo.Bar('a', 'b', 'c'); // valid 

以下呼叫產生編譯錯誤。 function does not take this many arguments,或者你會得到的一些類似的標準編譯錯誤,如果你手動定義void(char, char, char)

myfoo.Bar('a', 'b'); 
myfoo.Bar('a', 'b', 'c', 'd'); // error 
myfoo.Bar('a', 'b', "flob"); // error 
// ... 

回答

3

如果您使用的是C++ 14,你可以做這樣的:

#include <utility> 

template<std::size_t N, class = std::make_index_sequence<N>> 
class Foo; 

template<std::size_t N, std::size_t... Is> 
class Foo<N, std::index_sequence<Is...>>{ 
    void Bar(decltype(Is, char{})... args) // Some arguments of type char 
    { /* do stuff */ } 
}; 

[live demo]

對於C++ 11你需要實現integer_sequence,使其工作。 ..它可以這樣做this

+2

我正要發佈這個...... Dammit:D – Quentin

+0

你可能會解釋什麼'class ='在第一個模板中做? –

+1

這是爲第二個模板參數標記默認值。使用這個你不會用兩個參數調用Foo。 –