std::bind on statd::array 的运算符 []
std::bind on operator[] of std::array
我正在尝试在 std::array 的 or operator[] 处绑定一个成员函数,但编译器 (gcc 7.3( 说它无法确定_Func的类型名。所以我创建了自己的结构数组来查看问题所在。但在这种情况下,它适用于鳍。
#include <iostream>
#include <functional>
#include <array>
template<typename ret, unsigned int size>
struct my_arr {
ret data[size];
ret& at(unsigned int i) {return data[i];}
ret& operator[](unsigned int i){return data[i];}
};
using namespace std::placeholders;
using namespace std;
int main() {
my_arr<int,3> ma = {1,2,3};
auto x = std::bind(&my_arr<int,3>::at, _1, 0); // ok
auto x1 = std::bind(&my_arr<int,3>::operator[], _1, 0); // ok
auto arr_x = std::bind(&array<double, 3>::at, _1, _2); // error
auto arr_x = std::bind(&array<double, 3>::operator[], _1, _2); // error
std::cout << x(ma) << std::endl << x1(ma) << std::endl;
}
编译错误为:
调用 'bind(, const std::_Placeholder<1>&, const 时没有匹配函数 标准::_Placeholder<2>&(' auto arr_x = std::bind(&array::at, _1, _2(; ^
我已经意识到导致此错误的原因,但我仍然不知道如何解决它。问题是编译器不知道我引用哪个函数,因为这些函数有常量和非常量变体。此代码模拟相同的错误。
#include <iostream>
#include <functional>
#include <array>
template<typename ret, unsigned int size>
struct my_arr {
ret data[size];
ret& at(unsigned int i) {return data[i];}
const ret& at(unsigned int i) const {return data[i];}
ret& operator[](unsigned int i){return data[i];}
};
using namespace std::placeholders;
using namespace std;
int main() {
my_arr<int,3> ma = {1,2,3};
auto x = std::bind(&my_arr<int,3>::at, _1, 0); // error
auto x1 = std::bind(&my_arr<int,3>::operator[], _1, 0); // ok
std::cout << x(ma) << std::endl << x1(ma) << std::endl;
}
我仍然不知道如何指定我要调用哪个版本的函数,如何绑定常量版本和非常量版本?
由于您有两个重载:
ret& at(unsigned int i)
和const ret& at(unsigned int i) const
编译器不知道您真正想要绑定到哪个函数重载。因此,您需要将函数指针强制转换为确切的函数签名。
这将起作用:
auto x = std::bind(static_cast<int&(my_arr<int, 3>::*)(unsigned int)>(&my_arr<int,3>::at), _1, 0);
现场查看
您还可以使用 lambda 以更优雅的方式解决问题:
auto x2 = [&ma](auto const p) { return ma.at(p); };
std::cout << x2(0) << std::endl; // output: 1
相关文章:
- 为什么比较运算符如此快速
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 增量运算符与后缀混淆
- 一个关于在C++中重载布尔运算符的问题
- 运算符C++ "delete []"仅删除 2 个前值
- 模板类无法识别友元运算符
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 关闭||运算符优化
- 通过继承类使用来自不同命名空间的运算符
- C++Cast运算符过载
- 如何使用AngelScript注册SFML Vector2运算符
- 重载元组索引运算符-C++
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 布尔比较运算符是如何在C++中工作的
- 重载运算符new[]的行为取决于析构函数
- std::bind on statd::array 的运算符 []