折叠表达式作为 [] 运算符的参数
Fold expression as argument of [] operator
>我正在尝试使用折叠表达式作为 [] 运算符的参数。不幸的是,只有第一个元素是正确的。
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
现场演示
相关文章:
- 如何使基类的运算符对基类的可变参数数可见(请参阅下面的代码)?
- 具有两个间接寻址运算符 (C++) 的函数参数的用途
- 运算符重载:"operator+"必须采用零个或一个参数
- 为什么数组大小信息可用于"sizeof"运算符和 delete[] 运算符,但在将数组作为参数传递到
- 参数相关查找和流运算符重载
- C++:使用运算符 = 调用多参数构造函数
- 了解布尔运算符==(参数 1,参数 2)
- 我能否根据其运算符()的签名专门化可变参数模板参数
- SFINAE 检查模板参数运算符
- 不允许运算符 const 参数调用 const 成员函数
- 为私有结构定义双参数运算符重载
- C++ 通过自定义赋值运算符隐式转换函数参数
- 函数参数变量总是需要 & 或 * 运算符吗?
- 算术运算符参数类型
- 隐式转换以匹配运算符参数
- 对重载运算符参数执行隐式转换时出现编译器错误
- 避免在C++中强制转换运算符参数
- 如果给定模板不是运算符参数类型的专用模板,则禁用运算符重载
- 以及C++中的运算符参数求值
- 这个函数的运算符参数太多