std::array派生class聚合初始化
std::array derived class aggregate initialization
我正在制作一个派生自 std::array
的小帮手 class。显然,构造函数不继承,它负责大括号初始化;例如:
template<typename T, size_t size>
struct foo : std::array<T,size>
{
foo(int a, int b)
: std::array<T,size>{a,b}
{
//nothing goes here since constructor is just a dummy that
//forwards all arguments to std::array constructor
}
}
int main()
{
foo<int,2> myobj = {1,2}; //brace initialization calls custom constructor with inner elements as arguments
}
参数的数量必须完全匹配,所以我倾向于在构造函数中使用可变函数参数之类的东西(因为我不仅要每次都在数组中使用 2 个元素)。使用这个,我如何将可变参数包转发给 std::array
构造函数?我对允许转发到 std::array
构造函数的其他大括号初始化方法持开放态度。
注意:std::initializer_list
需要运行时初始化,我正在寻找编译 time/constexpr 兼容的方法。谢谢。
您可以使用完美转发构造函数:
template<class... U>
foo(U&&... u)
: std::array<T, size>{std::forward<U>(u)...}
{}
我不认为从标准容器继承是个好主意。
总之...
您可以使用可变参数模板、完美转发以及 SFINAE 来强加参数的数量正好是 size
。
您还可以使 constexpr
成为 foo
构造函数,这样您就可以创建 constexpr foo
个对象。
举例
#include <array>
#include <type_traits>
template <typename T, std::size_t S>
struct foo : public std::array<T, S>
{
template <typename ... As,
typename std::enable_if<sizeof...(As) == S>::type * = nullptr>
constexpr foo (As && ... as)
: std::array<T, S>{ { std::forward<As>(as)... } }
{ }
};
int main ()
{
//constexpr foo<int, 2u> myobj1 = {1}; // compilation error
constexpr foo<int, 2u> myobj2 = {1, 2}; // compile
//constexpr foo<int, 2u> myobj3 = {1, 2, 3}; // compilation error
}
我正在制作一个派生自 std::array
的小帮手 class。显然,构造函数不继承,它负责大括号初始化;例如:
template<typename T, size_t size>
struct foo : std::array<T,size>
{
foo(int a, int b)
: std::array<T,size>{a,b}
{
//nothing goes here since constructor is just a dummy that
//forwards all arguments to std::array constructor
}
}
int main()
{
foo<int,2> myobj = {1,2}; //brace initialization calls custom constructor with inner elements as arguments
}
参数的数量必须完全匹配,所以我倾向于在构造函数中使用可变函数参数之类的东西(因为我不仅要每次都在数组中使用 2 个元素)。使用这个,我如何将可变参数包转发给 std::array
构造函数?我对允许转发到 std::array
构造函数的其他大括号初始化方法持开放态度。
注意:std::initializer_list
需要运行时初始化,我正在寻找编译 time/constexpr 兼容的方法。谢谢。
您可以使用完美转发构造函数:
template<class... U>
foo(U&&... u)
: std::array<T, size>{std::forward<U>(u)...}
{}
我不认为从标准容器继承是个好主意。
总之...
您可以使用可变参数模板、完美转发以及 SFINAE 来强加参数的数量正好是 size
。
您还可以使 constexpr
成为 foo
构造函数,这样您就可以创建 constexpr foo
个对象。
举例
#include <array>
#include <type_traits>
template <typename T, std::size_t S>
struct foo : public std::array<T, S>
{
template <typename ... As,
typename std::enable_if<sizeof...(As) == S>::type * = nullptr>
constexpr foo (As && ... as)
: std::array<T, S>{ { std::forward<As>(as)... } }
{ }
};
int main ()
{
//constexpr foo<int, 2u> myobj1 = {1}; // compilation error
constexpr foo<int, 2u> myobj2 = {1, 2}; // compile
//constexpr foo<int, 2u> myobj3 = {1, 2, 3}; // compilation error
}