我正在尝试使用fold表达式作为[]运算符的参数。不幸的是,只有第一个元素是正确的。
template <class ...U> T& operator[](U ...indices){
size_t i=0, k[get_n_dimensions()];
(... , void(k[i++]=indices));
// use k[0], k[1], ...
// only k[0] is correct
}
但是,如果我对函数的参数使用相同的语法,则可以正常工作。
template <class ...U> T get(U ...indices) const {
size_t i=0, k[get_n_dimensions()];
(... , void(k[i++]=indices));
// k[0], k[1], ... filled correctly
}
是什么原因?解决办法是什么?
答案 0 :(得分:7)
是什么原因?
数组下标运算符(json_query('value')
)必须只有一个参数。您显示的第一个代码段对任何operator[]
都是无效的。
sizeof...(U) != 1
之类的功能模板或get
之类的另一个运算符没有类似的限制。
有什么解决方案?
请勿使用operator()
。
答案 1 :(得分:4)
C ++没有多维索引,这是语法的“硬连接”-您不能通过重载来添加它。
您的代码完全编译的原因是//activity[@name="Manufacturing"]
等效于//solarsystem/activity[@name='Manufacturing']
-也就是说,它使用常规的逗号运算符来计算p[a,b]
并忽略结果,然后产生p[(a,b)]
的值作为a
的索引。
因此,您的模板永远不会“杂乱无章地”使用,但实际上与
相同b
您需要命名函数,或重载可以使用多个参数的运算符,例如p
。
答案 2 :(得分:0)
正如其他人所述,下标运算符operator[]
必须仅接受一个参数。
请参阅[over.sub](强调我的)
operator[]
应该是具有一个参数的非静态成员函数。它实现了下标语法
但是,一个参数不必是整数。
如果能够像这样将值移动到std::index_sequence
中,您仍然可以做您想做的事情:
template<size_t... indices>
T& operator[](std::index_sequence<indices...>){
size_t i=0, k[get_n_dimensions()];
(... , void(k[i++]=indices));
// ...
}
你会这样称呼
my_instance[std::make_index_sequence<3>{}]; // passes 0, 1, 2 to the function