2014-05-04 55 views
1

我想使用N個參數創建可變參數模板,其中N也是模板參數。例如,具有正好n個參數的可變參數模板

template <int N, typename T[N]> 
void function(T t[N]) { 
    // do stuff with t[0] through t[N-1] 
} 

(我知道上面是無效的語法)

我知道,一個方法來實現這一目標是使用static_assertsizeof...(ArgsT)其中ArgsT是一個可變參數模板定義(即template <typename ...ArgsT>) 。

我只是想知道是否有更好的方法,不一定涉及static_assert

+2

static_assert已編譯的一個不錯的失敗(堅持下去) –

+1

總之,要在包大小不等於INT參數編譯時錯誤? 'static_assert'就是爲了這個,爲什麼它不是最好的方法呢? – Chnossos

+1

你也可以用'std :: enable_if'來使用SFINAE。但我不確定這是否更好。 – Jarod42

回答

7

可以使用std::enable_if代替static_assert

template <std::size_t N, typename ...Args> 
auto function(Args&&... args) 
    -> typename std::enable_if<N == sizeof...(Args), void>::type 
{ 
    ... 
} 

更新:也有可能在構造函數,其中N是類的模板參數來使用它。

template <std::size_t N> 
struct foobar 
{ 
    template <typename ...Args, typename = typename std::enable_if<N == sizeof...(Args), void>::type> 
    foobar(Args&&... args) { ... } 
}; 
+0

有沒有可能爲構造函數做到這一點? – parsiad

+0

@par你打算如何通過'N'? – Yakk

+0

template class A {/ * STUFF * /}; – parsiad

相關問題