Re: поддержка кортежей на уровне языка
От: Evgeny.Panasyuk Россия  
Дата: 16.02.13 20:36
Оценка: 160 (6) +1
Здравствуйте, niXman, Вы писали:

X>в идеале, хотелось бы чего-то типа


$$(int, std::string, double) result = $(33, "string", .14);
auto result2 = func();
int i         = result%$0;
std::string s = result%$1;
double d      = result%$2;
int sizet = size(result);
static_assert($sizeof(result) == $sizeof(func()), "bad size");

Подойдёт?

  реализация
#include <tuple>
#include <type_traits>
#include <iostream>
#include <ostream>

#define $(...) std::make_tuple(__VA_ARGS__)
#define $$(...) std::tuple<__VA_ARGS__>

template<unsigned i,typename ...Ts>
auto operator%(const std::tuple<Ts...> &t,std::integral_constant<unsigned,i>) -> decltype(std::get<i>(t))
{
   return std::get<i>(t);
}

std::integral_constant<unsigned,0> $0;
std::integral_constant<unsigned,1> $1;
std::integral_constant<unsigned,2> $2;

template<typename ...Ts>
auto custom_sizeof(const std::tuple<Ts...>&) -> char (&)[sizeof...(Ts)];

#define $sizeof(T) sizeof(custom_sizeof(T))

template<typename ...Ts>
unsigned size(const std::tuple<Ts...>&)
{
   return sizeof...(Ts);
}

auto func() -> $$(int, std::string, double) { return $(11,"ss",1.1); }


int main()
{
   using namespace std;
   $$(int, std::string, double) result = $(33, "string", .14);
   auto result2 = func();
   int i         = result%$0;
   std::string s = result%$1;
   double d      = result%$2;
   cout << i << " " << s << " " << d << endl;
   int sizet = size(result);
   static_assert($sizeof(result) == $sizeof(func()), "bad size");
   cout << $sizeof(result) << endl;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.