1

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

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

错误:“项目 &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. 具有同质数据的可变参数模板
  2. 使用 constexpr C++11
4

1 回答 1

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];
于 2013-04-11T16:34:50.510 回答