C++ 如何像数组一样访问元组(具有括号重载和类型安全)?

C++ 如何像数组一样访问元组(具有括号重载和类型安全)?,c++,C++,我试图构建一个元组类,它可以像数组一样访问。我可能会将内容转换为(void*),但这会破坏模板的用途,因为我试图获得类型安全性 我正在使用VS2010 pro进行编译。我当前的非工作解决方案产生以下错误 错误:“Item&MyList::operator”:无法推断“N”的模板参数 #包括 #包括 模板 结构MyList{ std::元组项; 模板 Ty&运算符[](int N){ auto&var=std::get(项目); 收益var; } }; void main(){ MyList列表;

我试图构建一个元组类,它可以像数组一样访问。我可能会将内容转换为(void*),但这会破坏模板的用途,因为我试图获得类型安全性

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

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

#包括
#包括
模板
结构MyList{
std::元组项;
模板
Ty&运算符[](int N){
auto&var=std::get(项目);
收益var;
}
};
void main(){
MyList列表;
自动变量=列表[0];
}
潜在解决方案:(编辑)


  • 这取决于要用什么索引元组。如果您使用的是运行时整数,那么很明显您无法实现类型安全性;编译器无法知道返回什么类型(在元组是同构的情况下除外,见上文)

    另一方面,如果您刚刚了解了订阅的语法,则可以使用具有适当类型的索引对象来执行此操作,例如(用于说明)现成的
    std::占位符

    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); }
    

    现在睡觉,以后再回答。如果我使用一个常量文本,它可以在编译时推断,我想编译器会知道类型。我不介意将所有9个索引定义为专门的模板,如果它能够使这项工作正常的话。使用_1etc并不是我想要的解决方案。不过,我现在意识到为什么它不适用于整数。我没有考虑值是存储在变量中还是通过函数传递。谢谢。我用C++11 constexpr找到了另一个解决方案。我可能不得不考虑切换编译器…
    using namespace std::placeholders;
    auto var = list[_1];