Добавить operator [] на std::tuple, std::variant, std::pair

Raiden LuiKang
Raiden LuiKang
// example

std::tuple<int, double, float> my_tuple;

int first = my_tuple[ _1  ]; 
double second = my_tuple[ _2 ];
float third = my_tuple[ _3 ];


std::pair< std::string, bool > p;

std::string s = p[ _1 ] ;
bool b = p[ _2 ];

4
рейтинг
2 комментария
yndx-antoshkka

Placeholders не очень удобные, лучше использовать литералы по налогии с Boost.Hana:

#include <string>
#include <tuple>

template <std::size_t I>
constexpr std::integral_constant<std::size_t, I> operator"" _c() {
    return {};
}

struct Fish { std::string name; };
struct Cat  { std::string name; };
struct Dog  { std::string name; };

auto animals = std::make_tuple(Fish{"Nemo"}, Cat{"Garfield"}, Dog{"Snoopy"});

// Access tuple elements with operator[] instead of std::get.
Cat garfield = animals[1_c];
yndx-antoshkka
Raiden LuiKang

yndx-antoshkka,

 

Ну тогда, да реализация будет еще простой:

template< typename ...Args > struct tuple
{


.......

     // Вроде такого.
     template< size_t I >
   auto operator [] (  std::integral_constant<std::size_t, I> ) const { return std::get<I>(*this); }

    // и пара  перегрузок для non-const , r-value references.
};

 

Мне безумно не нравится использовать  std::get  в своем коде, потому что там сначала думать об индекс , а потом сам контайнер. В Массиве наоборот, сначала пищем контайнер, а потом сам индекс.

Raiden LuiKang
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).
Все предложения