如何从构造函数参数初始化模板成员数组?

时间:2016-03-26 09:16:44

标签: c++ arrays templates c++11 c++14

基本上我想要一个模板类,其数组的大小是模板参数,用于保存常量内容。

类似的东西:

template<size_t S> struct Foo {
    const int bar[S];
    Foo(const int(&par)[S]) : bar(par) {
        cout << "bar size is " << S << endl;
    }
};
auto foo = Foo({1,2,3});

我一直在搜索和修改,几乎有一个使用中间静态方法并使用std :: array实现的解决方法:

template<size_t S> struct Baz {
  const array<int,S> qux;
  Baz(const array<int,S>&par) : qux(par) {
    cout << "size is " << S << endl;
  }
};
template<size_t S> Baz<S>
GetBaz(const array<int,S>&in) {
  return Baz<S>(in);
}

int main() {
  auto sample = GetBaz({1,2,3});
  return 0;
}

...这已经是一些样板了,但是std :: array似乎还没有从初始化列表中构造出来? : - (

prog.cpp: In function 'int main()':
prog.cpp:27:30: error: no matching function for call to 'GetBaz(<brace-enclosed initializer list>)'
  auto sample = GetBaz({1,2,3});

3 个答案:

答案 0 :(得分:5)

Post DR1591内置数组绑定现在可以从 braced-init-list 中删除,所以:

template<size_t S> struct Baz {
  const array<int,S> qux;
  Baz(const array<int,S>&par) : qux(par) {
    cout << "size is " << S << endl;
  }
  Baz(const int (&par)[S]) : qux(std::experimental::to_array(par)) {}
};

template<size_t S> Baz<S>
GetBaz(const int (&in)[S]) {
  return Baz<S>(in);
}

std::experimental::to_array从内置版本创建std::array。请参阅链接的cppreference页面以了解实现。

你可以一直使用内置数组,但这有点令人讨厌:

template<size_t S> struct Baz {
  const int bar[S]; 

  template<size_t... Is>
  Baz(const int (&par)[S], std::index_sequence<Is...>)
      : bar { par[Is]... } {}

  Baz(const int (&par)[S]) : Baz(par, std::make_index_sequence<S>()) {}
};

template<size_t S> Baz<S>
GetBaz(const int (&in)[S]) {
  return Baz<S>(in);
}

答案 1 :(得分:2)

不确定我是否完全理解这些问题。那是你想要实现的目标吗?

$("#myModal").modal();

要点:

  1. 使用#include <iostream> #include <array> template<size_t S> struct Baz { const std::array<int,S> qux; Baz(const std::array<int,S>& par) : qux(par) { std::cout << "size is " << qux.size() << std::endl; } }; int main() { auto sample = Baz<5>({1,2,3}); // size = 5, values = 1, 2, 3, 0, 0 return 0; } 代替原始数组。
  2. 指定模板参数,例如:std::array不推断出类模板参数。

答案 2 :(得分:0)

您可以使用经典C数组,但使用可变参数构造函数

#include <array>
#include <cstddef>
#include <iostream>

using namespace std;

template <size_t S> struct Foo {
    const int bar[S];
    const std::array<int, S> bar2;

    template <typename ... I>
       Foo (const I & ... i) : bar {i...}, bar2 {{i...}}
    {
      cout << "bar size is " << S << " == " <<
         (sizeof(bar)/sizeof(bar[0])) << " == " << bar2.size() << endl;
    }
};

int main()
 {
   Foo<3>  foo {1,2,3};

   auto  foo2 = Foo<4>{1,2,3,4};

   return 0;
 }