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

Fold expression as argument of [] operator

本文关键字:运算符 参数 表达式 折叠      更新时间:2023-10-16

>我正在尝试使用折叠表达式作为 [] 运算符的参数。不幸的是,只有第一个元素是正确的。

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
}

原因是什么?解决方案是什么?

原因是什么?

数组下标运算符 (operator[]) 必须只有一个参数。您显示的第一个代码段对任何sizeof...(U) != 1都无效。

get这样的函数模板或像operator()这样的其他运算符没有类似的限制。


解决方案是什么?

不要使用operator[] .

C++没有

多维索引,这是"硬连线"到语法中 - 你不能通过重载来添加它。

您的代码编译的原因是p[a,b]等效于 p[(a,b)] - 也就是说,它使用常规逗号运算符,该运算符将计算a并忽略结果,然后生成 b 的值作为索引到 p 中。

因此,您的模板永远不会"可变"使用,而是

本质上与
template <class U> T& operator[](U indices)

您需要命名函数,或重载可以采用多个参数的运算符,例如 operator()

正如其他人所提到的,下标运算符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

现场演示