Я хотел бы скрыть std :: tuple в моем классе «Запись» и предоставить ему [[]] доступ к элементам кортежа. Наивный код, который не компилируется это:C++ Прямой вызов функции-члена без шаблона для функции шаблона
#include <tuple>
template <typename... Fields>
class Record {
private:
std::tuple<Fields...> list;
public:
Record() {}
auto operator[](std::size_t n)
-> decltype(std::get<1u>(list)) {
return std::get<n>(list);
}
};
int main() {
Record<int, double> r;
r[0];
return 0;
}
г ++ 4,6 говорит:
x.cc:13:32: error: no matching function for call to ‘get(std::tuple<int, double>&)’
x.cc:13:32: 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 ...>&)
В основном я хотел бы назвать Record::operator[]
так же, как на массиве. Это возможно?
@ Lol4t0 Последнее является хорошей отправной точкой. Почему вы хотите изменить аргумент шаблона MyT :: get в MyT :: get (size_t i)? Будут ли ваши пользователи действительно ожидать, что [i] будут иметь разные типы в зависимости от i? –
@JohanLundberg Извините, я не понимаю. Это было направлено на меня? – pmr
А, нет, я согласен с тобой. «ты» в моем последнем посте означала быть ОП. –