Vardiadisches Makro zum Initialisieren mehrerer Objekte



  • Hallöchen,
    ich habe Folgendes im Sinn:

    DECLARE_VALUES(
      0, PETER, "123",
      1, KARL, "456
    );
    

    um folgendes zu erhalten:

    enum class Ids {
      PETER = 0,
      KARL = 1
    };
    
    char const* const names[] = {
      "PETER",
      "KARL"
    };
    
    char const* const pattern[] = {
      "123",
      "456"
    };
    

    Noch besser wäre: Die Ids werden nicht explizit angegeben sondern ab 0 aufsteigend generiert.

    Meine Frage ist jetzt: Gibt das der Preprozessor her? Wenn ja, irgendeinen Tipp wie?

    Vielen Dank und lg,
    Florian



  • Das kann man mit Boost Preprocessor machen.

    Variadischer Wahnsinn schrieb:

    Noch besser wäre: Die Ids werden nicht explizit angegeben sondern ab 0 aufsteigend generiert.

    Das machen enum s sowieso.



  • Variadischer Wahnsinn schrieb:

    Meine Frage ist jetzt: Gibt das der Preprozessor her? Wenn ja, irgendeinen Tipp wie?

    #define AS_ENUM(a,b) a,
    #define AS_NAME(a,b) #a,
    #define AS_PATTERN(a,b) b,
    
    #define VALUES					\
      X(PETER, "123")				\
      X(KARL, "456")
    
    #define X AS_ENUM
    enum class ids {
      VALUES
    };
    #undef X
    
    #define X AS_NAME
    const char* const names[] {
      VALUES
    };
    #undef X
    
    #define X AS_PATTERN
    const char* const patterns[] {
      VALUES
    };
    #undef X
    

  • Mod

    #include <boost/preprocessor/arithmetic/mul.hpp>
    #include <boost/preprocessor/arithmetic/div.hpp>
    #include <boost/preprocessor/arithmetic/inc.hpp>
    #include <boost/preprocessor/repetition/enum.hpp>
    #include <boost/preprocessor/tuple/elem.hpp>
    #include <boost/preprocessor/tuple/size.hpp>
    #include <boost/preprocessor/variadic/to_tuple.hpp>
    #include <boost/preprocessor/stringize.hpp>
    
    #define DECLARE_ENUM(z, N, T) \
      BOOST_PP_TUPLE_ELEM(BOOST_PP_MUL(2, N), T) /*= N Hier kann noch erweitert werden*/
    #define DECLARE_NAME(z, N, T) \
      BOOST_PP_STRINGIZE(BOOST_PP_TUPLE_ELEM(BOOST_PP_MUL(2, N), T))
    #define DECLARE_PATTERN(z, N, T) \
      BOOST_PP_STRINGIZE(BOOST_PP_TUPLE_ELEM(BOOST_PP_INC(BOOST_PP_MUL(2, N)), T))
    
    #define DECLARE_VALUES_(T) \
      enum class IDs          { BOOST_PP_ENUM(BOOST_PP_DIV(BOOST_PP_TUPLE_SIZE(T), 2), DECLARE_ENUM   , T) }; \
      char const *names  [] = { BOOST_PP_ENUM(BOOST_PP_DIV(BOOST_PP_TUPLE_SIZE(T), 2), DECLARE_NAME   , T) }, \
                 *pattern[] = { BOOST_PP_ENUM(BOOST_PP_DIV(BOOST_PP_TUPLE_SIZE(T), 2), DECLARE_PATTERN, T) };
    
    #define DECLARE_VALUES(...) DECLARE_VALUES_(BOOST_PP_VARIADIC_TO_TUPLE(__VA_ARGS__))
    
    DECLARE_VALUES(Peter  , 123,
                   Karl   , 456,
                   Volkard, Tuntenfriseurstammkunde)
    
    #include <iostream>
    
    int main()
    {
        std::cout << (int)IDs::Peter << ' ' << (int)IDs::Karl << ' ' << (int)IDs::Volkard << '\n';
    	for (auto c : names) std::cout << c << '\n';
    	for (auto c : pattern) std::cout << c << '\n';
    }
    

    Demo.



  • Vielen Dank Leute! 🙂


Anmelden zum Antworten