gpt4 book ai didi

c++ - 可变参数宏和参数包扩展

转载 作者:太空狗 更新时间:2023-10-29 21:32:32 30 4
gpt4 key购买 nike

在下面的示例代码中,我想使用带有可变参数的 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;
}

最佳答案

  1. 可变参数模板不能自动成为 std::initializer_list。因此,让我们用大括号将可变参数括起来。
struct Register {
template <typename... TArgs>
Register(TArgs&&... args) {
do_something({std::forward<TArgs>(args)...}); // Make params to be initializer List
//also do other things after do_something, omit here
// ...
}
};
  1. 由于 Register 构造函数是模板化的,因此编译器似乎无法推断出 {EnumOneTypes::One0, EnumTwoTypes::Two0} 属于哪种类型。所以让我们指定它的类型:
MACRO_EXPANSION(
register_two,
EnumTypes{EnumOneTypes::One0, EnumTwoTypes::Two0},
EnumTypes{EnumOneTypes::One1, EnumTwoTypes::Two1}
);

应用这两个后,它编译成功并运行并输出:

Do something
Do something
Test the usage of this macro

我在 godbolt 中测试过.

关于c++ - 可变参数宏和参数包扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54839691/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com