Functor——周边

本文介绍了如何通过Chainer模板类实现Functor的串联,并讨论了转发函数的成本问题及小对象分配器的优势。同时,文章还探讨了通过栈记录Functor来实现Undo和Redo功能的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用一个库要比开发一个库简单的多, 对于使用Functor而言,我些小东西需要知道,这包括其他特性、效率以及可行扩展。

1.将请求串联起来

    template <class Fun1, class Fun2>
    Fun2 Chain(
        
const Fun1& fun1,
        
const Fun2& fun2)
    
{
        
return Fun2(std::auto_ptr<typename Fun2::Impl>(
            
new Chainer<Fun1, Fun2>(fun1, fun2)));
    }

可以看到,Chainer在负责处理了所有问题:

    template <typename Fun1, typename Fun2>
    
class Chainer : public Fun2::Impl{}

关于串起来的方法,其实很简单,在operator()处玩了个花招而已:

       ResultType operator()()
        
return f1_(), f2_(); }

        ResultType 
operator()(Parm1 p1)
        
return f1_(p1), f2_(p1); }
        
        ResultType 
operator()(Parm1 p1, Parm2 p2)
        
return f1_(p1, p2), f2_(p1, p2); }
        
        ResultType 
operator()(Parm1 p1, Parm2 p2, Parm3 p3)
        
return f1_(p1, p2, p3), f2_(p1, p2, p3); }
        ...

局限性一目了然,串起来的Functor们必须共享参数,你无法定制各个参数。所以,对于参数不同的情况,BindFirst是个不错的选择。

2.转发函数的成本

    template <typename T>
    
class TypeTraits
    
{};

        template 
<class U> struct ReferenceTraits
        
{
            
enum { result = false };
            typedef U ReferredType;
        }
;
        
        template 
<class U> struct ReferenceTraits<U&>
        
{
            
enum { result = true };
            typedef U ReferredType;
        }
;

传引用是个不错的选择,只可惜有的时候会传成引用的引用或者对立即数传引用,好在我们有TypeTrails可以区分开这些,进而根据类型选择不同处理方式。

3.Heap分配

小对象分配器在处理这个问题的时候显示了它的优势。

4.Undo和Redo

用栈记录Functor是解决这个问题的有效途径。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值