#include <tuple>
#include <iostream>
#include <boost/preprocessor.hpp>
#define CREATE_NAMED_TUPLE(name, fields) \
namespace name { \
enum { \
BOOST_PP_SEQ_FOR_EACH_I(NAMED_TUPLE_FE_COMMA, 1, fields) \
}; \
typedef std::tuple<BOOST_PP_SEQ_FOR_EACH_I(NAMED_TUPLE_FE_COMMA, 0, fields)> type; \
}
#define NAMED_TUPLE_FE_COMMA(r, tuple_elem, idx, elem) \
BOOST_PP_COMMA_IF(idx) BOOST_PP_TUPLE_ELEM(2, tuple_elem, elem)
CREATE_NAMED_TUPLE(
my_fancy_tuple,
((int, foo))
((int, bar))
((float, baz))
)
int main() {
auto i = my_fancy_tuple::type(1, 2, 3.2f);
std::cout << std::get<my_fancy_tuple::foo>(i) << " " << std::get<my_fancy_tuple::bar>(i) << " " << std::get<my_fancy_tuple::baz>(i) << "\n";
return 0;
}