替换 std::function 的调用值
Replace invocation values for std::function
我已将 std::function
的结果存储在列表中:
typedef std::pair<int, std::function<void(HDC)>> myPair;
std::list<myPair> *paintJobs;
paintJobs = new std::list<myPair>();
然后我添加这样的内容:
int id = 1;
int x = 0;
int y = 0;
int width = 100;
int height = 100;
int r = 255;
int g = 0;
int b = 0;
std::function<void(HDC)> func = std::bind(&Window::drawRect, this, std::placeholders::_1, x, y, width, height, r, g, b);
paintJobs->push_back(std::make_pair(id, func));
在我的绘画方法中,我遍历列表并调用我添加的所有函数。这部分效果很好。
但是现在,我想交换例如颜色(r、g 和 b):
void changeColor(int id, int r, int g, int b) {
for(auto elem = paintJobs->begin(); elem != paintJobs->end(); ++elem) {
if(elem->first == id){
//change the 6th, 7th and 8th parameter of elem->second
}
}
}
我的另一个想法是插入一个新条目并复制旧值,但还有另一个问题:获取绑定值。
那么如何替换参数的绑定值或获取其他参数的值?
存储 std::function<void(HDC, int r, int g, int b)>
(或等效项)而不是 std::function<void(HDC)>
。同时存储一个 struct {int r,g,b;}
.
struct rgb { int r,g,b; };
struct rgb_func {
rgb color;
std::function<void(HDC, rgb)> f;
void operator()(HDC hdc)const{
return f(hdc, color);
}
};
std::function<void(HDC, rgb)> func =
[this, x, y, width, height](HDC hdc, rgb color)->void
{
this->drawRect( hdc, x, y, width, height, color.r, color.g, color.b );
};
paintJobs->push_back(std::make_pair(id, rgb_func{ {r,g,b}, func }));
然后更改它:
void changeColor(int id, int r, int g, int b) {
for(auto elem = paintJobs->begin(); elem != paintJobs->end(); ++elem) {
if(elem->first == id){
elem->second.color = {r,g,b};
}
}
}
注意 second
的类型不再是 std::function<void(HDC)>
,而是 convertible-to 和 std::function<void(HDC)>
但不是来自它。这种转换可能会产生适度的开销;在这种情况下,使用 auto&
可以避免这种情况。
代码未测试;设计是合理的。可能有 tpyos。我会让 rgb
更好一点(比如,保证归零或其他)。
我使用 lambda 而不是 std::bind
,因为 std::bind
令人困惑并且在添加到 std
时几乎已经过时了。
顺便说一句
void changeColor(int id, int r, int g, int b) {
for(auto& elem:*paintJobs) {
if(elem.first == id){
elem.second.color = {r,g,b};
}
}
}
不那么乱了。
您可以采用如下解决方案:
- 将绑定参数存储在别处。
- 传递给你的函数
std::bind(f, ..., std::ref(param)...)
想法是可以修改参数:
std::function<void(HDC)> func = std::bind(&Window::drawRect, this, std::placeholders::_1, std::ref(x)...
现在您可以从外部修改参数,当再次调用该函数时它将使用新值。
另一种解决方案是更改 std::function
的签名以获取每次调用的参数。
我已将 std::function
的结果存储在列表中:
typedef std::pair<int, std::function<void(HDC)>> myPair;
std::list<myPair> *paintJobs;
paintJobs = new std::list<myPair>();
然后我添加这样的内容:
int id = 1;
int x = 0;
int y = 0;
int width = 100;
int height = 100;
int r = 255;
int g = 0;
int b = 0;
std::function<void(HDC)> func = std::bind(&Window::drawRect, this, std::placeholders::_1, x, y, width, height, r, g, b);
paintJobs->push_back(std::make_pair(id, func));
在我的绘画方法中,我遍历列表并调用我添加的所有函数。这部分效果很好。
但是现在,我想交换例如颜色(r、g 和 b):
void changeColor(int id, int r, int g, int b) {
for(auto elem = paintJobs->begin(); elem != paintJobs->end(); ++elem) {
if(elem->first == id){
//change the 6th, 7th and 8th parameter of elem->second
}
}
}
我的另一个想法是插入一个新条目并复制旧值,但还有另一个问题:获取绑定值。
那么如何替换参数的绑定值或获取其他参数的值?
存储 std::function<void(HDC, int r, int g, int b)>
(或等效项)而不是 std::function<void(HDC)>
。同时存储一个 struct {int r,g,b;}
.
struct rgb { int r,g,b; };
struct rgb_func {
rgb color;
std::function<void(HDC, rgb)> f;
void operator()(HDC hdc)const{
return f(hdc, color);
}
};
std::function<void(HDC, rgb)> func =
[this, x, y, width, height](HDC hdc, rgb color)->void
{
this->drawRect( hdc, x, y, width, height, color.r, color.g, color.b );
};
paintJobs->push_back(std::make_pair(id, rgb_func{ {r,g,b}, func }));
然后更改它:
void changeColor(int id, int r, int g, int b) {
for(auto elem = paintJobs->begin(); elem != paintJobs->end(); ++elem) {
if(elem->first == id){
elem->second.color = {r,g,b};
}
}
}
注意 second
的类型不再是 std::function<void(HDC)>
,而是 convertible-to 和 std::function<void(HDC)>
但不是来自它。这种转换可能会产生适度的开销;在这种情况下,使用 auto&
可以避免这种情况。
代码未测试;设计是合理的。可能有 tpyos。我会让 rgb
更好一点(比如,保证归零或其他)。
我使用 lambda 而不是 std::bind
,因为 std::bind
令人困惑并且在添加到 std
时几乎已经过时了。
顺便说一句
void changeColor(int id, int r, int g, int b) {
for(auto& elem:*paintJobs) {
if(elem.first == id){
elem.second.color = {r,g,b};
}
}
}
不那么乱了。
您可以采用如下解决方案:
- 将绑定参数存储在别处。
- 传递给你的函数
std::bind(f, ..., std::ref(param)...)
想法是可以修改参数:
std::function<void(HDC)> func = std::bind(&Window::drawRect, this, std::placeholders::_1, std::ref(x)...
现在您可以从外部修改参数,当再次调用该函数时它将使用新值。
另一种解决方案是更改 std::function
的签名以获取每次调用的参数。