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

C++ 折叠表达式作为[]运算符的参数,c++,C++,我试图使用折叠表达式作为[]运算符的参数。不幸的是,只有第一个元素是正确的 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 } 模板T和运算符[](U…索引){ 尺寸i

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

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
}
模板T和运算符[](U…索引){
尺寸i=0,k[获取尺寸();
(…,void(k[i++]=指数));
//使用k[0],k[1]。。。
//只有k[0]是正确的
}
但是,如果我对函数的参数使用相同的语法,它就可以正常工作

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
}
模板T获取(U…索引)常量{
尺寸i=0,k[获取尺寸();
(…,void(k[i++]=指数));
//k[0],k[1],…填写正确
}
原因是什么?解决办法是什么

原因是什么

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

类似于
get
的函数模板或类似于
operator()
的另一个操作符没有类似的限制


解决办法是什么


不要使用
运算符[]

C++没有多维索引,这是语法中的“硬连接”——不能通过重载添加它

代码编译的原因是
p[a,b]
相当于
p[(a,b)]
——也就是说,它使用常规的逗号运算符来计算
a
,忽略结果,然后生成
b
的值作为
p
的索引

因此,您的模板从未“可变地”使用过,但本质上与

template <class U> T& operator[](U indices)
模板T和运算符[](U索引)

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

正如其他人所提到的,订阅运算符
operator[]
必须只接受一个参数

参见[over.sub](强调我的

运算符[]
应为非静态成员函数,且只有一个参数。它实现了订阅语法

但是,一个参数不必是整数

如果您能够将您的价值观转变为类似的模式,您仍然可以随心所欲:

模板
T运算符[](标准::索引_序列){
尺寸i=0,k[获取尺寸();
(…,void(k[i++]=指数));
// ...
}
你会这么说的

my_instance[std::make_index_sequence<3>{}]; // passes 0, 1, 2 to the function
my_实例[std::make_index_sequence{}];//将0、1、2传递给函数

k[获取尺寸()]
?这不是C++。@ MatthuuBuurg:为什么不?@ MatthuuRuuur::Case> Gethnn维维度()/Cyto>可以是代码> CONTXPRP,否则,实际上是VLA。抱歉,它是剩余代码的残余。为了使它独立,我可以用sizeof…(索引)来代替它。实际上,它可以是
constexpr
。我想OP应该做的是使用
操作符()
。你触发了我太多的snark检测器,我认为这是不可能的……谢谢!我担心[]接线员不可能做到这一点。但是自从它编译之后。。。
my_instance[std::make_index_sequence<3>{}]; // passes 0, 1, 2 to the function