jam*_*o00 4 c++ templates initializer-list c++11
在C++ 11中,是否可以执行与以下类似的操作?
template<typename T, size_t N>
void foo(array<T, N> src) { ... }
...
foo({1, 2, 3})
Run Code Online (Sandbox Code Playgroud)
我目前正在运行GCC 4.8.
是的,我设法得到以下工作(因为你允许类似的东西):
template<typename T, size_t N>
void foo(array<T, N> src) { ... }
...
foo('a', 'b');
foo(1, 2, 3);
Run Code Online (Sandbox Code Playgroud)
方法如下:
#include <array>
#include <iostream>
#include <utility>
using namespace std;
template<typename T, unsigned long N>
void foo(array<T,N> src) {
for (auto e : src)
cout << e << endl;
}
template<class T, class... Tail>
auto make_array(T head, Tail... tail) -> std::array<T, 1 + sizeof...(Tail)>
{
std::array<T, 1 + sizeof...(Tail)> a = {{ head, tail ... }};
return a;
}
template<class T, class... Tail>
void foo(T&& head, Tail&&... values) {
foo(make_array(std::forward<T>(head), std::forward<Tail>(values)...));
}
int main() {
foo('a', 'b');
foo(1, 2, 3);
}
Run Code Online (Sandbox Code Playgroud)
我用gcc 4.7.2和clang 3.4(trunk 184647)进行了测试,它们按预期工作.
这是Stacked-Crooked的在线版本.但是,此代码无法在Ideone上编译.由于我无法弄清楚在Ideone中传递给编译器的选项,我已经放弃了该网站.
我无耻地make_array从@Pavel Minaev回答如何模拟C数组初始化"int arr [] = {e1,e2,e3,...}"std :: array的行为中无耻地窃取了这个函数?题.其他make_array建议导致我无法解决的编译错误.
此make_array功能有一定的局限性,请阅读整个帖子 ; 特别是讨论std :: array - 如果只知道它在comp.lang.c ++上的大小.参考调制.显然,获得合理make_array是非常棘手的.我不建议make_array在这个答案中使用简单的头脑用于生产代码.
如果size是模板参数,则不会有任何问题std::initializer_list.因此问题为什么大小不是std :: initializer_list的模板参数?
| 归档时间: |
|
| 查看次数: |
2212 次 |
| 最近记录: |