TMP: как написать код шаблона, который преобразует любую структуру в кортеж?

Возможно ли использовать шаблонное метапрограммирование для преобразования любой структуры или класса в кортеж?

Например:

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; Кроме того, документация была хорошо насыщена кислородом, и, похоже, примеров для запуска достаточно.

7

Решение

Я не думаю, что есть способ сделать это в C ++.

Я не знаю, как перечислить поля / типы в структуре — если бы вы могли это сделать, я бы подумал, что создание такого кортежа было бы довольно просто.

Я считаю, что Boost.Fusion имеет макрос, который помогает с этим, называется FUSION_ADAPT_STRUCT, но это все вручную.

Технический термин для этого — «отражение», и вы можете найти много информации об этом, выполнив поиск «C ++ отражение».

Вот одна из таких статей: Как добавить отражение в приложение C ++?

7

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]