std::get использует класс перечисления в качестве аргумента шаблона

Я использую std::tupleи определил перечисление класса, чтобы каким-то образом "называть" каждое из полей кортежа, забывая об их фактических индексах.

Итак, вместо этого:

std::tuple<A,B> tup;
/* ... */
std::get<0>(tup) = bleh; // was it 0, or 1?

Я сделал это:

enum class Something {
     MY_INDEX_NAME = 0,
     OTHER_INDEX_NAME
};

std::tuple<A,B> tup;
/* ... */
std::get<Something::MY_INDEX_NAME> = 0; // I don't mind the actual index...

Проблема в том, что, поскольку это скомпилировано с использованием gcc 4.5.2, я установил версию 4.6.1, и мой проект не смог скомпилироваться . Этот фрагмент воспроизводит ошибку:

#include <tuple>
#include <iostream>

enum class Bad {
    BAD = 0
};

enum Good {
    GOOD = 0
};

int main() {
    std::tuple<int, int> tup(1, 10);
    std::cout << std::get<0>(tup) << std::endl;
    std::cout << std::get<GOOD>(tup) << std::endl; // It's OK
    std::cout << std::get<Bad::BAD>(tup) << std::endl; // NOT!
}

Ошибка в основном говорит о том, что нет перегрузки, соответствующей моему вызову std::get:

test.cpp: In function ‘int main()’:
test.cpp:16:40: error: no matching function for call to ‘get(std::tuple<int, int>&)’
test.cpp:16:40: note: candidates are:
/usr/include/c++/4.6/utility:133:5: note: template<unsigned int _Int, class _Tp1, class _Tp2> typename std::tuple_element<_Int, std::pair<_Tp1, _Tp2> >::type& std::get(std::pair<_Tp1, _Tp2>&)
/usr/include/c++/4.6/utility:138:5: note: template<unsigned int _Int, class _Tp1, class _Tp2> const typename std::tuple_element<_Int, std::pair<_Tp1, _Tp2> >::type& std::get(const std::pair<_Tp1, _Tp2>&)
/usr/include/c++/4.6/tuple:531:5: note: template<unsigned int __i, class ... _Elements> typename std::__add_ref<typename std::tuple_element<__i, std::tuple<_Elements ...> >::type>::type std::get(std::tuple<_Elements ...>&)
/usr/include/c++/4.6/tuple:538:5: note: template<unsigned int __i, class ... _Elements> typename std::__add_c_ref<typename std::tuple_element<__i, std::tuple<_Elements ...> >::type>::type std::get(const std::tuple<_Elements ...>&)

Итак, есть ли способ использовать мой класс перечисления в качестве аргумент шаблона для std::get? Было ли это чем-то, что не было предназначено для компиляции и было исправлено в gcc 4.6? Я мог бы использовать простое перечисление, но мне нравятся свойства области действия классов перечисления, поэтому я бы предпочел использовать последнее, если это возможно.

11
задан mfontanini 24 May 2012 в 17:18
поделиться