c++模板编程- 函数对象的简单实现(类型擦除)

template<typename R, typename... Args>
class FunctorBridge {
 public:

    virtual ~FunctorBridge() = default;

    virtual FunctorBridge *clone() const = 0;

    virtual R invoke(Args... args)  = 0;

    virtual R invoke(Args... args) const = 0;
};


template<typename Functor, typename R, typename... Args>
class SpecificFunctorBridge : public FunctorBridge<R, Args...> {
    Functor functor;
 public:
    template<typename FunctorFwd>
    explicit SpecificFunctorBridge(FunctorFwd &&functor)
            : functor(std::forward<FunctorFwd>(functor)) {}

    virtual SpecificFunctorBridge *clone() const override {
        return new SpecificFunctorBridge(functor);
    }

    R invoke(Args ... args)  override {
        cout << boost::typeindex::type_id_with_cvr<Functor>().pretty_name() << endl;
        return functor(std::forward<Args>(std::forward<Args>(args))...);
    }

    R invoke(Args ... args) const override {
        cout << boost::typeindex::type_id_with_cvr<Functor>().pretty_name() << endl;
        return functor(std::forward<Args>(std::forward<Args>(args))...);
    }
};

template<typename Signature>
class FunctionPtr;

template<typename R, typename ...Args>
class FunctionPtr<R(Args...)> {
 private:
    FunctorBridge<R, Args...> *bridge;
 public:
    FunctionPtr() : bridge(nullptr) {}

    template<typename F>
    FunctionPtr(F &&f) {
        using Functor = decay_t<F>;
        using Bridge = SpecificFunctorBridge<Functor, R, Args...>;
        bridge = new Bridge(forward<F>(f));
    }

    R operator()(Args...args) {
        return bridge->invoke(std::forward<Args>(args)...);
    }
};

class AA {
 private:
    int xx;
 public:
    void operator()(int x) {
        xx++;
        cout << "A::operator()()" << endl;
    }

    void operator()(int x) const{
        cout << "A::operator()() const" << endl;
    }
};

void pr(int x) {
    cout << "pr" << endl;
}

int main() {
    // lamda
    FunctionPtr<void(int)> xx([](int) {
        cout << "hello world" << endl;
    });
    xx(12);

    // 函数指针
    FunctionPtr<void(int)> xy(pr);
    xy(12);

    // 函数对象
    AA a{};
    FunctionPtr<void(int)> xz(a);
    xz(12);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值