Нет, в C ++ нет способа узнать имена всех членов или сколько членов на самом деле там.
Вы можете хранить все типы в mpl::vector
в своих классах, но тогда вы сталкиваетесьпроблема в том, как превратить их в члены с соответствующими именами (чего нельзя достичь без некоторого взлома макросов).
Использование std::tuple
вместо POD - это решение, которое обычно работает, но создает невероятно грязный код, когда выфактически работает с кортежем (без именованных переменных), если вы не преобразуете его в какой-то момент или у вас нет оболочки, которая перенаправляет методы доступа на член кортежа.
class message {
public:
// ctors
const int& foo() const { return std::get<0>(data); }
// continue boiler plate with const overloads etc
static std::size_t nun_members() { return std::tuple_size<data>::value; }
private:
std::tuple<int, long long, foo> data;
};
Решение с Boost.PP и MPL:
#include <boost/mpl/vector.hpp>
#include <boost/mpl/at.hpp>
#include <boost/preprocessor.hpp>
#include <boost/preprocessor/arithmetic/inc.hpp>
struct Foo {
typedef boost::mpl::vector<int, double, long long> types;
// corresponding type names here
#define SEQ (foo)(bar)(baz)
#define MACRO(r, data, i, elem) boost::mpl::at< types, boost::mpl::int_<i> >::type elem;
BOOST_PP_SEQ_FOR_EACH_I(MACRO, 0, SEQ)
};
int main() {
Foo a;
a.foo;
}
Я не проверял, чтобы не было ошибок.