具有相等参数类型的可变参数模板函数

时间:2015-12-14 17:25:07

标签: c++ c++11 variadic-templates

我想写一个像这样的模板函数:

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

显然,C ++不允许这样做,因为在...args的左侧需要有一个模板参数包才能使用。我想要的是一个模板函数,其中所有参数类型都相同。有没有一种简单的方法可以做到这一点?

3 个答案:

答案 0 :(得分: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...);
   }

void使返回类型为输入参数的common_type,否则你可以明确指定你想要的类型。

答案 1 :(得分: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

答案 2 :(得分: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;
}