简化冗余std :: array初始化,当时没有constexpr构造函数
Simplify redundant std::array initialization when class has no constexpr constructor
我有以下代码的复杂版本:
#include <array>
#include <cmath>
using namespace std;
class Dummy
{
public:
Dummy(const double a, const double f)
{
//Some complex calculations
}
};
constexpr double values[] { 0.1, 0.2, 0.3, 0.4 };
constexpr auto N = sizeof(values) / sizeof(values[0]);
static const array<Dummy, N> dummies {Dummy(10 * values[0], M_PI * 0),
Dummy(10 * values[1], M_PI * 1),
Dummy(10 * values[2], M_PI * 2),
Dummy(10 * values[3], M_PI * 3)};
int main()
{
//Complex use of dummies
return 0;
}
我想简化dummies
数组的初始化,因为它是高度冗余的。但是,我一定是C 11,我无法将Dummy
类更改为具有constexpr
构造函数(这将极大地简化我的情况(。
我已经看过variadic模板,但似乎无法解决Dummy
的构造函数不是constexpr
:
template<size_t... Is>
struct _Helper
{
static constexpr array<Dummy, N> dummies {Dummy(10 * values[Is], M_PI * Is)...}; //Fails to compile because Dummy's constructor is not constexpr
};
static const array<Dummy, N> dummies { _Helper<0, 1, 2, 3>::dummies };
还有其他方法可以简化数组的初始化吗?可以将values
重新列出为实际上可以在运行时转换回double[]
的其他任何内容。
也许您可以如下创建一个make函数
template <std::size_t ... Is>
std::array<Dummy, sizeof...(Is)> makeDummArr (double const * vals)
{ return { { Dummy(10 * vals[Is], M_PI * Is)... } }; } }
并使用它来初始化
static const std::array<Dummy, N> dummies = makeDummArr<0, 1, 2, 3>(values);
可惜您一定会遇到C 11:如果您的Is...
列表是顺序的(从零开始(,如果您可以使用C 14 ... SO std::make_index_sequence
和std::index_sequence
...
我的意思是
template <std::size_t ... Is>
std::array<Dummy, sizeof...(Is)> makeDummArr
(double const * vals, std::index_sequence<Is...> const &)
{ return { { Dummy(10 * vals[Is], M_PI * Is)... } }; }
static const std::array<Dummy, N> dummies
= makeDummArr(values, std::make_index_sequence<4U>{});
(或者您可以遵循HolyBlackCat的建议,并在C 11中创建std::index_sequence
和std::make_index_sequence
的替代品(
以下代码与 @max66的建议相似,
但不需要您手动键入0, 1, ..., N-1
。
template <int ...I> struct int_seq // A rip-off of C++14 std::index_sequence.
{
template <int X> using push_back = int_seq<I..., X>;
};
template <int N> struct make_int_seq_impl
{
using type = typename make_int_seq_impl<N-1>::type::template push_back<N-1>;
};
template <> struct make_int_seq_impl<0>
{
using type = int_seq<>;
};
template <int N> using make_int_seq = typename make_int_seq_impl<N>::type;
template <int ...I> array<Dummy, N> make_dummies(int_seq<I...>)
{
return {Dummy(10 * values[I], M_PI * I)...};
}
static const array<Dummy, N> dummies = make_dummies(make_int_seq<N>{});
相关文章:
- "error: no matching function for call to"构造函数错误
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 选择要调用的构造函数
- 如何委托派生类使用其父构造函数?
- 构造函数正在调用一个使用当前类类型的函数
- 没有用于初始化C++中的变量模板的匹配构造函数
- 初始化具有非默认构造函数的std::数组项的更好方法
- 当从函数参数中的临时值调用复制构造函数时
- 在c++构造函数中使用随机字符串生成器
- 一对向量构造函数:初始值设定项列表与显式构造
- 从构造函数抛出异常时如何克服内存泄漏
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 具有默认模板类型的默认构造函数的类型推导
- 使用dynamic_cast和构造函数时出错
- 在c++中使用向量时,如何调用构造函数和析构函数
- 简化冗余std :: array初始化,当时没有constexpr构造函数