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);
}
c++模板编程- 函数对象的简单实现(类型擦除)
最新推荐文章于 2023-05-16 23:38:33 发布