如何使用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预处理器是坏主意。 最好使用元编程解决此问题。 这是一个有助于构造数组的工具:
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 }; }) }
{
}
};
.