为了账号安全,请及时绑定邮箱和手机立即绑定

如何模拟C数组初始化“int arr[]={e1,e2,E3,…}“行为与STD:数组?

如何模拟C数组初始化“int arr[]={e1,e2,E3,…}“行为与STD:数组?

C++
紫衣仙女 2019-12-18 11:13:40
如何模拟C数组初始化“int arr[]={e1,e2,E3,…}“行为与STD:数组?它独特的初始化特性:int arr[] = { 1, 3, 3, 7, 0, 4, 2, 0, 3, 1, 4, 1, 5, 9 };我们不需要指定元素的数量,万岁!现在用C+11函数迭代它std::begin和std::end从…<iterator> (或者你自己的变体你甚至不需要考虑它的大小。现在,是否有任何方法(可能是TMP)来实现与std::array?使用宏可以使它看起来更好看。*)??? std_array = { "here", "be", "elements" };编辑*根据各种答案汇编的中间版本如下:#include <array>#include <utility>template<class T, class... Tail, class Elem = typename std::decay<T>::type>std::array<Elem,1+sizeof...(Tail)> make_array(T&& head, Tail&&... values){  return { std::forward<T>(head), std::forward<Tail>(values)... };}// in codeauto std_array = make_array(1,2,3,4,5);并使用了所有酷C+11的东西:可变模板sizeof...rvalue引用完美转发std::array当然,均匀初始化忽略具有一致初始化的返回类型类型推断(auto)可以找到一个例子这里.不过,正在对@Xaade的答案的注释中指出的那样,您不能用这样的函数初始化嵌套类型。例子:struct A{ int a; int b; };// C syntaxA arr[] = { {1,2}, {3,4} };// using std::array??? std_array = { {1,2}, {3,4} };此外,初始化器的数量仅限于实现支持的函数和模板参数的数量。
查看完整描述

3 回答

?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

我能想到的是:

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+编译器都能对其进行优化,使其与直接初始化一样快。




查看完整回答
反对 回复 2019-12-19
?
慕斯王

TA贡献1864条经验 获得超2个赞

我想要一个简单的make_array.

template<typename ret, typename... T> std::array<ret, sizeof...(T)> make_array(T&&... refs) {
    // return std::array<ret, sizeof...(T)>{ { std::forward<T>(refs)... } };
    return { std::forward<T>(refs)... };}


查看完整回答
反对 回复 2019-12-19
  • 3 回答
  • 0 关注
  • 358 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信