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