#include #include
template<class T, class... Tail, class Elem = typename std::decay ::type> std::array<Elem,1+sizeof...(Tail)> make_array(T&& head, Tail&&... values) { return { std::forward (head), std::forward (values)... }; }
// in code auto std_array = make_array(1,2,3,4,5); 并采用了各种很酷的C ++ 11东西:
可变参数模板 sizeof... 右值引用 完美的转发 std::array, 当然 统一初始化 通过统一初始化省略返回类型 类型推断(auto) 在这里可以找到一个例子。
但是,正如@Johannes在对@Xaade的答案的评论中指出的那样,您无法使用此类函数初始化嵌套类型。例:
struct A{ int a; int b; };
// C syntax A arr[] = { {1,2}, {3,4} }; // using std::array ??? std_array = { {1,2}, {3,4} }; 同样,初始化器的数量限于实现所支持的函数和模板参数的数量。 问题来源于stack overflow
我能想到的最好的是:
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; }
auto a = make_array(1, 2, 3); 但是,这要求编译器执行NRVO,然后还跳过返回值的副本(这也是合法的,但不是必需的)。实际上,我希望任何C ++编译器都能对其进行优化,使其与直接初始化一样快。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。