我正在尝试构建一个可以像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];
}
潜在解决方案:(编辑)
答案 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];