【发布时间】:2019-02-23 17:34:27
【问题描述】:
在下面的示例代码中,我想使用带有可变参数的MACRO_EXPANSION 和{...} 来构造EnumTypes 对象的列表。但是,我无法使这个想法奏效。 (PS。代码结构可能看起来不太好,但我需要它:))
#include <iostream>
#include <utility>
#include <initializer_list>
enum class EnumOneTypes {
One0,
One1
};
enum class EnumTwoTypes {
Two0,
Two1
};
struct EnumTypes {
EnumOneTypes one;
EnumTwoTypes two;
};
void do_something(std::initializer_list<EnumTypes> il) {
std::cout << "Do something" << std::endl;
}
// Need this struct to forward arguments
struct Register {
template <typename... TArgs>
Register(TArgs&&... args) {
do_something(std::forward<TArgs>(args)...);
//also do other things after do_something, omit here
// ...
}
};
// Use this macro to define global static objects
#define MACRO_EXPANSION(name, ...) \
static struct Register name(__VA_ARGS__)
MACRO_EXPANSION(
register_two,
{EnumOneTypes::One0, EnumTwoTypes::Two0},
{EnumOneTypes::One1, EnumTwoTypes::Two1}
);
MACRO_EXPANSION(
register_three,
{EnumOneTypes::One0, EnumTwoTypes::Two0},
{EnumOneTypes::One1, EnumTwoTypes::Two1},
{EnumOneTypes::One0, EnumTwoTypes::Two1}
);
int main() {
std::cout << "Test the usage of this macro" << std::endl;
return 0;
}
【问题讨论】: