使用Boost预处理器静态初始化阵列

问题描述 投票:0回答:1

如何使用Boost预处理器来静态地将带有字符串和指针对的数组初始化,如下所示。

#include <string> struct Node; struct Port { Port(std::string name_, Node* owner_): name(name_), owner(owner_) { } std::string name; Node* owner; }; struct Node { // TODO: replace with Port port[4] = { REPEAT_SEQ(RX, 4) }; Port port[4] = {{"RX_0", this}, {"RX_1", this}, {"RX_2", this}, {"RX_3", this}}; }; int main() { Node node; }
问题是,有些节点有很多端口,并且编写这些端口名称和所有者指针对很乏味,并且容易出错。
我想用升压预处理器自动化它,例如

REPEAT_SEQ(RX, 4)

	
事实证明,您的问题并不那么简单。整个问题是造成的,这并不容易构造不可约束的类型数组。

使用Boost预处理器是坏主意。 最好使用元编程解决此问题。 这是一个有助于构造数组的工具:
c++ c-preprocessor boost-preprocessor
1个回答
0
投票
template <typename F, size_t... Is> auto help_genarate_array(F&& f, std::index_sequence<Is...>) { return std::array { f(Is)... }; } template <size_t N, typename F> auto genarate_array(F&& f) { return help_genarate_array(std::forward<F>(f), std::make_index_sequence<N>()); }

使用此工具,您可以现在初始化数组:


struct Node { std::array<Port, 4> port; Node() : port { genarate_array<4>([this](auto i) { return Port { std::format("RX_{}", i), this }; }) } { } };

livedemo
.

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.