c++ - 当类没有 constexpr 构造函数时简化冗余 std::array 初始化

标签 c++ arrays c++11 variadic-templates template-meta-programming

我有以下代码的更复杂版本:

#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 数组的初始化,因为它是高度冗余的。但是,我绑定(bind)到 C++11,我无法将 Dummy 类更改为具有 constexpr 构造函数(这将大大简化我的情况)。

我看过可变参数模板,但似乎无法回避 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 ...所以 std::make_index_sequencestd::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_sequencestd::make_index_sequence 的替代品)

关于c++ - 当类没有 constexpr 构造函数时简化冗余 std::array 初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48724687/

相关文章:

c++ - 迭代可变模板类型

c++ - LNK2038,迭代器不匹配错误,需要忽略

java - 如何将输入文件中的行分配给类值数组?

c++ - constexpr 函数不在编译时计算值

c++ - 从转换中获取结果顶点?

c++ - 比较 C++20 中的多态类型

c++ - 读取文本文件并将数据存储到多个数组 C++

ruby-on-rails - Rails 3 has_many - 在 View 中使用

c++ - 递归可变函数模板

qt - 将 lambda 函数连接到 QProcess::error 时出错