C++ 存储一个C++;20来自转发引用的类似于函数的对象?
在C++20中,假设我想C++ 存储一个C++;20来自转发引用的类似于函数的对象?,c++,c++20,C++,C++20,在C++20中,假设我想std::make_unique一个副本(或根据需要移动),并存储一个类似于函数的对象,该对象在转发引用中传递 template<typename F> std::unique_ptr<???> make_copy_of_functor(F&& f) { return std::make_unique<???>(std::forward<F>(f)); } 还是我需要用某种方式来腐蚀它?(我可能对转
std::make_unique
一个副本(或根据需要移动),并存储一个类似于函数的对象,该对象在转发引用中传递
template<typename F>
std::unique_ptr<???> make_copy_of_functor(F&& f) {
return std::make_unique<???>(std::forward<F>(f));
}
还是我需要用某种方式来腐蚀它?(我可能对转发引用的引用折叠规则感到困惑。)作为转发引用,当传递左值
F
将被推断为左值引用时,您可以使用删除引用部分(并为函数类型添加指针)
模板
自动生成\u复制\u函子(F&&F){
返回std::make_unique(std::forward(f));
}
您可以按值传递,然后移动到新对象中:
template <typename F>
auto make_copy_of_functor(F f) {
return std::make_unique<F>(std::move(f));
}
模板
自动生成\u复制\u函子(F){
返回std::make_unique(std::move(f));
}
实际上我得到了错误:new不能应用于函数类型
当用于普通函数时,我猜转发引用引用了函数,而没有应用函数到指针的标准转换。如果我使用make_copy_of_functor(&my_函数),它会工作。也许std::decay
更好?不确定。@AndrewTomazos是的,我们需要将F
显式设置为函数指针类型<代码>复制函数(&my函数)就是这样做的。是的,std::decay
似乎更好。是的,如果我们使用std::decay
,那么make_copy_of_functor(我的函数)
可以工作(没有&
)。与其他解决方案相比,这难道不是双倍的移动吗?一个移动到函数参数中,然后另一个移动到构造函数中?或者其中一个被省略了?是的。如果通过右值传递,这将调用两个移动操作,否则将调用一个复制操作和一个移动操作。但是move操作很便宜,而且这个代码看起来更整洁(这可能不太容易出错)。
template<typename F>
auto make_copy_of_functor(F&& f) {
return std::make_unique<std::decay_t<F>>(std::forward<F>(f));
}
template <typename F>
auto make_copy_of_functor(F f) {
return std::make_unique<F>(std::move(f));
}