C++ 11从初始化列表到数组参数的隐式转换

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.

Ali*_*Ali 6

是的,我设法得到以下工作(因为你允许类似的东西):

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的模板参数?