如何访问像阵列一样的元组(括号过载和类型安全)?

时间:2013-04-11 14:06:20

标签: c++

我正在尝试构建一个可以像Array一样访问的Tuple类。我可能会把事情变成(void *)但是这会破坏模板的目的,因为我试图获得类型安全。

我正在使用VS2010 pro进行编译。我当前的非工作解决方案会产生以下错误。

错误:'Item& MyList :: operator':无法推断'N'的模板参数。

#include <tuple>
#include <stdio.h>

template <int size, typename Ty0, 
typename Ty1=std::tr1::_Nil, typename Ty2=std::tr1::_Nil, typename Ty3=std::tr1::_Nil,
typename Ty4=std::tr1::_Nil, typename Ty5=std::tr1::_Nil, typename Ty6=std::tr1::_Nil, 
typename Ty7=std::tr1::_Nil, typename Ty8=std::tr1::_Nil, typename Ty9=std::tr1::_Nil>
struct MyList {
    std::tuple<Ty0, Ty1, Ty2, Ty3, Ty4, Ty5, Ty6, Ty7, Ty8, Ty9> items;

    template <int N, typename Ty>
    Ty &operator[](int N) {
        auto &var = std::get<N>(items);
        return var;
    }
};

void main() {
    MyList<2, int, double> list;
    auto var = list[0];
}

潜在解决方案:(编辑)

  1. Variadic templates with homogeneous data
  2. Using constexpr C++11

1 个答案:

答案 0 :(得分:3)

这取决于您想要使用索引元组的内容。如果您正在使用运行时整数,那么显然您无法获得类型安全性;编译器无法知道返回什么类型(在元组是同构的情况下,其他情况,见上文)。

另一方面,如果您只是在订阅语法之后,可以使用具有适当类型的索引对象来执行此操作,例如: (用于说明)现成的std::placeholders

template<typename T>
typename std::tuple_element<std::is_placeholder<T>::value,
  std::tuple<Ty0, Ty1, Ty2, Ty3, Ty4, Ty5, Ty6, Ty7, Ty8, Ty9>>::type &
operator[](T) { return std::get<std::is_placeholder<T>::value>(items); }

用法:

using namespace std::placeholders;
auto var = list[_1];