你会如何编写一个模板函数,它在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)
| 归档时间: |
|
| 查看次数: |
917 次 |
| 最近记录: |