c++ - C++:将不可移动函子传递给 std::function
问题描述
如何将不可移动的对象传递给 std::function?一个足够简单的替代方法是传递 a std::reference_wrapper
,这将创建函数生命周期依赖于对象的需求。下面的示例代码可以更好地解释这个问题。
class Player {
std::atomic_int runs {0};
std::string name;
public:
Player(std::string&& name) : name(std::move(name)) {} //...
void inc() { ++runs;}
};
class PlayerStats {
std::array<std::unique_ptr<Player>,2> players;
public:
PlayerStats() {
for(int i = 0; i<2 ; i++)
players[i] = std::unique_ptr<Player>(new Player{"player"+std::to_string(i)});
}
Player* const operator() (int index) const {
return players[index].get();
}
};
using player_total_f = std::function<Player* const(int index)>;
class GameStats {
std::string game;
std::string date;
player_total_f f;
public:
GameStats(std::string&& game, std::string&& date, player_total_f&& _f) :
game(std::move(game)), date(std::move(date)), f(std::move(_f)) {}
};
int main(int argc, char *argv[])
{
PlayerStats st;
//GameStats("game1","10.11",std::ref(st)); //this seems like the only possibility, no way to make GameStats own the functor
return 0;
}
鉴于它是不可复制的,我如何将这里的函数设置为PlayerStats
std::ref 似乎是唯一的可能性?
解决方案
template<class F>
auto shared_function( F&& f ){
auto spf=std::make_shared<std::decay_f<F>>(std::forward<F>(f));
return [spf=std::move(spf)](auto&&...args)->decltype(auto){
return (*pf)(decltype(args)(args)...);
};
}
在共享 ptr 中拥有它。稍微改变语义,但修复它。
或者编写自己的非复制 std 函数。
推荐阅读
- flutter - 文本与侧面的容器居中对齐
- django - Django 两个模型 CreateView
- c++ - 在 C++11 中不允许使用 auto
- excel - 使用 API 填充 Excel
- python - 如何使用 Mariadb 在 python sqlalchemy 中定义 DateTime?
- json - 将多个 json 对象转换为单个数据帧/csv
- html - 是什么导致此页面溢出?
- vue.js - Vue Composition Api - 观察从外部复合函数导入的属性
- ios - Firebase Analytics 在 iOS 14.5 上与 ATT 的合规性
- python - 我应该使用什么样的参数来查找和裁剪图像中的对象?