2

Nstd::size_t類型的模板參數。我想能夠調用我的類的構造函數有兩種方式:變量參數(包的大小爲N)和默認參數

A a(x1, x2, x3, ..., xN) 

A a(x1, x2, x3, ..., xN, xN1) 

其中xi變量都是同一類型的。我的第一個想法是:

template <std::size_t N> 
struct A 
{ 
    template <typename ...Args, typename = typename std::enable_if<N == sizeof...(Args), void>::type> 
    A(Args ...args) { 
     f(args...); // where f is some function 
    } 

    template <typename ...Args, typename = typename std::enable_if<N+1 == sizeof...(Args), void>::type> 
    A(Args ...args) { 
     // run f on the first N arguments 
     // run g on the last argument (selection is done using templates, I just did not want to write the code) 
    } 
}; 

該技術的解釋如下:Variadic templates with exactly n parameters。 當然,這個問題是你不能以這種方式重載構造函數。

任何想法?

回答

4

只是SFINAE不同的看法:

template <std::size_t N> 
struct A 
{ 
    template <typename ...Args, 
       typename std::enable_if<N == sizeof...(Args), int>::type = 0> 
    A(Args ...args) { 
    } 

    template <typename ...Args, 
       typename std::enable_if<N+1 == sizeof...(Args), int>::type = 0> 
    A(Args ...args) { 
    } 
}; 

Demo

+0

你能解釋一下嗎? – 0x499602D2 2014-10-11 15:38:25

+0

@ 0x499602D2 OP中的一個重新定義了相同的函數模板(使用不同的默認參數)。使簽名的'enable_if'部分成爲這兩個不同的函數模板。 – 2014-10-11 15:42:18

+0

那麼前者應該用於SFINAE嗎? – 0x499602D2 2014-10-11 15:51:31