2015-12-14 140 views
8

我想編寫一個模板函數,像這樣:平等參數類型可變參數模板功能

template <typename T> 
void f(const T & ...args) // <-- This doesn't work, unfortunately. 
{ 
    std::array<T> arr = { args... }; 
    // and so forth. 
} 

顯然,C++不允許的,因爲需要有在左側的模板參數包這個工作的一方...args。我想要的是一個模板函數,其中所有參數類型都是相同的。有沒有簡單的方法來做到這一點?

+0

如果你知道每一個參數的類型是相同的:'模板無效F(T const的&X ,Ts const&... xs){array arr = {x,xs ...};}' – 0x499602D2

+0

是類似的? http://stackoverflow.com/questions/30773216/variadic-template-parameters-of-one-specific-type – nonsensation

回答

3
template <typename ... T> 
    void f(const T & ... args) 
    { 
     std::array<typename std::common_type<T...>::type, 
        sizeof...(T)> arr = {args...}; 
    } 

std::experimental

template <typename ... T> 
    void f(const T & ... args) 
    { 
     auto arr = std::experimental::make_array<void>(args...); 
    } 

中的空隙,使返回類型爲輸入參數的common_type,否則你可以指定你想要什麼類型明確,如果你知道這一點。

+1

你可以省略''默認情況下 – melak47

+0

@ melak47不夠公平,我剛剛GOOGLE了這個功能一時興起,否則從來不知道它。我會把它放在那裏,讓人們看到他們可以放任何他們想要的東西而不是「無效」,但是否則你是絕對正確的。 – SirGuy

1

我想爲已經提出的解決方案增加一個解決方案。
您也可以使用initializer_list來做到這一點。
它遵循一個工作示例:

#include<initializer_list> 
#include<vector> 
#include<string> 

template<class T> 
void fn(std::initializer_list<T> l) { 
    std::vector<T> v(l); 
    // so on 
} 

int main() { 
    fn<std::string>({ "foo", " bar" }); 
    return 0; 
} 
3
#include <tuple> 
#include <type_traits> 

template <typename T, typename... Ts> 
auto f(const T& t, const Ts&... ts) 
    -> typename std::enable_if<std::is_same<std::tuple<T, Ts...> 
              , std::tuple<Ts..., T> 
           >::value>::type 
{ 
} 

DEMO

+0

如果參數不完全相同,我不確定用戶正在尋找錯誤的方法,但這是一個有趣的方式。 – SirGuy

+0

@GuyGreer *「我想要的是一個模板函數,其中所有參數類型都是相同的」* –

+0

我想我並沒有將其解釋爲表示如果不是這樣的話,那麼他就意味着錯誤。我以爲他正在尋找一個簡短的例子來說明情況。 – SirGuy