C++ 11:Variadic同构非POD模板函数参数?

And*_*zos 4 c++ c++11

你会如何编写一个模板函数,它在C++ 11中采用可变数量的同类非POD函数参数?

例如,假设我们想为任何定义小于"operator <"的类型编写min函数,如下所示:

// pseduo-code...

template<class T...>
T min(T x1, T x2, ..., T xn)
{
    T lowest = x1;

    for (T x : {x2,...,xn})
       if (x < lowest)
           lowest = x;

    return lowest;
}
Run Code Online (Sandbox Code Playgroud)

以上是非法的C++ 11,你怎么合法地写它?

ken*_*ytm 10

同质?只是用std::initializer_list.

template <typename T>
T min_impl(std::initializer_list<T> values)
{
    return *std::min_element(values.begin(), values.end());
}

...

return min_impl({8, 5, 4, 1, 6});
Run Code Online (Sandbox Code Playgroud)

(正如@Jesse所说,这相当于标准库中的std :: min.)

如果您不喜欢额外的大括号,请创建一个转换为初始化列表实现的可变参数模板:

template <typename... T>
auto min(T&&... args) -> decltype(min_impl({std::forward<T>(args)...}))
{
    return min_impl({std::forward<T>(args)...});
}

...

return min(8, 5, 1, 4, 6);
Run Code Online (Sandbox Code Playgroud)

  • 这也与[std :: min](http://en.cppreference.com/w/cpp/algorithm/min)相同(也许应该强调它是否是POD类型不会使差异). (2认同)
  • 应该注意的是,这不适用于仅移动类型。你不能移出`initializer_list`。 (2认同)