具有最少复制的前向函子
Forward functors with minimal copying
本文关键字:复制 更新时间:2023-10-16
我想转发函子调用,并仅在绝对必要时复制该函子。这是我的通用包装函数和函子:
template <typename F>
void wrapper (F func)
{
func ();
}
struct Functor
{
Functor() {}
void operator() () { /* do some work */ }
};
我可以用调用包装器
- 右值引用:包装器(Functor())
- 左值引用:函数f;包装物(f)
- const左值引用:const函数f;包装物(f)
- const右值引用:const函数make_Functor();包装器(make_functor())
我只想在传递const引用时复制包装器的arg。所以我想到了这样的包装器实现:
using safe_mutual_handler_type =
typename std::conditional<
std::is_reference<F>::value
, typename std::conditional<
std::is_const<typename std::remove_reference<F>::type>::value
, typename std::remove_const<typename std::remove_reference<F>::type>::type
, F&
>::type
, F&
>::type;
template <typename F>
void wrapper (F&& func)
{
safe_mutual_handler_type<F> tmp = func;
tmp ();
}
不是很好,错过了(不是很典型的)常量值引用案例,但基本上完成了它的工作。
但我可能也有带const运算符的Functor()
struct Functor {
Functor() {}
void operator() () const {}
};
在这种情况下,我根本不需要复制包装器的参数。
问题是:如果Functor有const圆括号运算符,我如何签入包装?另一个问题是,包装器是否可以以更智能、更紧凑的方式实现,而不需要大量的类型特征行typedefs?(实际上,我担心的不是代码大小,而是代码的可读性)。
如果您只是想在对引用的调用有效的情况下使用引用,请使用表达式SFINAE:
template <typename F>
auto wrapper_ (F&& func, int) -> decltype(func())
{
func ();
}
template <typename F>
void wrapper_ (F func, ...)
{
func ();
}
template <typename F>
void wrapper (F&& f)
{
wrapper_(std::forward<F>(f), 0);
}
如果您只想在传递可变引用时复制/移动它(并且仅限于此):
template <typename F>
auto wrapper_ (F&& func, std::true_type)
{
func ();
}
template <typename F>
void wrapper_ (F func, std::false_type.)
{
func ();
}
template <typename F>
void wrapper (F&& f)
{
wrapper_(std::forward<F>(f), std::is_const<typename std::remove_reference<F>::type>());
}
相关文章:
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 使用strcpy将char数组的元素复制到另一个数组
- 是否可以初始化不可复制类型的成员变量(或基类)
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 复制列表初始化的隐式转换的等级是多少
- 当从函数参数中的临时值调用复制构造函数时
- 有可能在Armadillo中复制MATLAB circshift方法吗
- 复制几乎为空的数组的最快方法
- 以下示例中如何避免代码复制?C++/库达
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 不能将复制初始化与隐式转换的多个步骤一起使用
- 当有分配器意识的容器被复制/移动时,反弹分配器是否被复制/移走
- 为什么复制而不是移动数据元素?
- 文件系统:复制功能的速度秘诀是什么
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 为什么类中的ostringstream类型的成员会导致";调用隐含删除复制构造函数";错误
- 使lambda不可复制/不可移动