折叠表达式作为[]运算符的参数

时间:2019-01-09 12:12:01

标签: c++

我正在尝试使用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
}

是什么原因?解决办法是什么?

3 个答案:

答案 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

Live Demo