【问题标题】:Variadic template function with equal argument types具有相同参数类型的可变参数模板函数
【发布时间】:2015-12-14 17:25:06
【问题描述】:

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

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

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

【问题讨论】:

  • 如果你知道每个参数类型都是一样的:template&lt;class T,class...Ts&gt;void f(T const&amp; x, Ts const&amp;...xs){array&lt;T,1+sizeof...(Ts)&gt; arr={x,xs...};}

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


【解决方案1】:
    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,否则你可以明确指定你想要的类型,如果你知道的话。

【讨论】:

  • 默认情况下可以省略&lt;void&gt;
  • @melak47 很公平,我只是一时兴起在谷歌上搜索了这个功能,否则根本不知道它。我会把它留在那里,以便人们看到他们可以放任何他们想要的东西,而不是 void,否则你是绝对正确的。
【解决方案2】:
#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

【讨论】:

  • 如果参数不完全相同,我不确定用户是否正在寻找一种出错的方法,但这是一种有趣的方法。
  • @GuyGreer “我想要的是一个所有参数类型都相同的模板函数”
  • 我想我并没有将其解释为如果不是,他想出错。我以为他正在寻找这种情况的简写。
【解决方案3】:

我会在已经提出的解决方案的基础上再添加一个解决方案。
您也可以使用 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-02
    • 1970-01-01
    • 1970-01-01
    • 2015-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多