Я задаюсь вопросом о том, как правильно зациклить элементы простого старого типа данных, чтобы получить некоторую информацию о них. То есть :
struct my_pod
{
int a;
double b;
};
template<typename POD>
void loopOverPOD()
{
for_each(POD, member) // The magic part
{
// member::type should be for my_pod int, then double
typename member::type i;
// member::size_of should be equal to sizeof(int) then sizeof(double)
// Trivial if we can have member::type information.
int size = member::size_of;
// member::offset_of should be equal to 0, then sizeof(int)
// Trivial if we can have member::size_of information.
int offset = member::offset_of;
}
}
Насколько я знаю в C ++, мы не можем сделать простой самоанализ типов без некоторых хитрых игр с шаблонами. Но здесь я не могу найти конкретного решения с помощью шаблонов, даже с использованием макроса на самом деле. И проблема скорее во мне, чем в существовании решения. 🙂
Я не обязательно прошу решение, которое не будет навязчивым.
Заранее спасибо.
Вы можете использовать boost.fusions ADAPT_STRUCT превратить ваш POD в последовательность, а затем использовать слияния для каждого применить функциональный объект к каждому члену. Это не навязчиво, ваш тип POD останется POD.
Хорошо, что вы даже можете поместить макросы ADAPT_STRUCT в (header-) файл отдельно от ваших структурных определений и использовать их только в коде, в котором вам нужно выполнять итерации.
С другой стороны, этот макрос требует избыточного упоминания как типа, так и имени членов снова. Я полагаю, что в какой-то момент Fusion будет использовать функции C ++ 11, чтобы избавиться от этой избыточности (снова упоминая тип). В то же время можно создать макрос, который будет объявлять структуру и часть ADAP_STRUCT.
C ++ не имеет конструкции для перебора элементов структуры.
Существует, однако, стандартный тип std::tuple
для которого вы можете использовать шаблоны для рекурсивной итерации его элементов во время компиляции.