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
enums 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
-
#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!
