2015-12-14 137 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