Возможно ли использовать шаблонное метапрограммирование для преобразования любой структуры или класса в кортеж?
Например:
struct Foo
{
char c;
int i;
std::string s;
};
typedef std::tuple< char, int, std::string > Foo_Tuple;
Было бы неплохо иметь некоторый шаблонный код, который автоматически сгенерирует Foo_Tuple для меня.
ОТВЕТ
Для такого простого случая это излишне, но для более сложных случаев (например, ORM или в любое время, когда вам нужно написать много стандартного кода, а простой шаблон или макрос не подходит для этой задачи), Boost Mirror похоже, это может быть чрезвычайно полезно. Я немного углубился в Boost Mirror: основные функциональные возможности отражения (в Mirror и Puddle) не сложны для понимания, довольно просты в настройке и кажутся довольно обширными (могут обрабатывать многие конструкции, включая C ++ 11). enum классы и т.д …). Я нахожу эту базовую функциональность более чем адекватной — я могу просто использовать MACROS в той степени, в которой я хочу представить свои классы в Reflection (чтобы мне не приходилось писать код в виде базовой таблицы). Фабричные генераторы также кажутся очень мощными (при той же начальной настройке макросов вы можете поменять любой заводской генератор, который вам нравится, для вывода JSON, SOCI или в поток и т. Д.), Но с большей кривой обучения / Настройка, если вы хотите написать свои собственные фабричные генераторы. Последняя пара замечаний: с некоторыми незначительными изменениями я смог заставить его работать с C ++ 11 на gcc 4.7.2; Кроме того, документация была хорошо насыщена кислородом, и, похоже, примеров для запуска достаточно.
Я не думаю, что есть способ сделать это в C ++.
Я не знаю, как перечислить поля / типы в структуре — если бы вы могли это сделать, я бы подумал, что создание такого кортежа было бы довольно просто.
Я считаю, что Boost.Fusion имеет макрос, который помогает с этим, называется FUSION_ADAPT_STRUCT, но это все вручную.
Технический термин для этого — «отражение», и вы можете найти много информации об этом, выполнив поиск «C ++ отражение».
Вот одна из таких статей: Как добавить отражение в приложение C ++?
Других решений пока нет …