samedi 23 février 2019

Variable arguments macro and parameter pack expansion

In the following sample code, I want to use the MACRO_EXPANSION with variable arguments and {...} to construct a list of EnumTypes Objects. However, I cannot make this idea work. (PS. the code structure may seem not well, but I need it :))

#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;
}

Aucun commentaire:

Enregistrer un commentaire