根据继承的class模板自动生成成员函数

Automatic generate member functions depending on inherited class template

我正在考虑一种自动检查对象是否有效的方法。 我有几个与硬件相关的对象(如 class A),可以通过外部(物理)事件删除它们。

为了检测这一点,我使用了 shared/weak 指针。但是现在我正在努力检查弱指针。由于这对于许多对象的每个成员函数都是以相同的方式完成的,因此我目前正在寻找一种方法来使用更少的冗余代码来完成此操作。 此外,我正在编写一个库,不希望用户处理这个(只是 return 指向用户自己处理它的弱指针因此没有选择)

我的最佳猜测如下所示。我的问题是,我找不到在模板中自动生成成员函数(func1 等)的方法。自己做会导致每个要验证的成员函数都有很多冗余代码(而且有很多)

A(以及更多其他对象)的每个成员函数都应由执行如下所示验证的函数包装。这对所有成员函数都是相同的,并且对许多 classes 完成,它们可以用作验证器的类型。 有谁知道如何解决这个问题?也许还有其他(更好的)方法可以解决这个问题。 非常感谢您的帮助。

一些限制: 只有 C++11 可能, 没有例外

    class A {
    public:
        void func1() {}
        //many more functions
    };

    template<typename T>
    class Validator
    {
        //has to be done for all functions of A
        void func1()
        {
            if (!wptr.expired())
            {
                wptr.lock()->func1();
            }
            else
                errorHandling();
        }

    private:
        std::weak_ptr<T> wptr;
        void errorHandling() {}
    };

如果调用者可以忍受笨拙的语法,您可以使用成员函数指针:

#include <memory>
#include <iostream>

class A {
public:
    void func1() {
        std::cout << "hello func1\n";
    }
};

template<typename T>
class Validator
{
public:
    Validator(std::shared_ptr<T> p) : wptr(p) {}

    
    template <typename MemFun>
    void call(MemFun mf) {
        if (!wptr.expired())
        {
            (wptr.lock().get()->*mf)();
        }
        else
            errorHandling();
    }
    

private:
    std::weak_ptr<T> wptr;
    void errorHandling() {}
};

int main() {
    auto x = std::make_shared<A>();
    Validator<A> v{x};
    v.call(&A::func1);
}

我会保护完整的用户函数调用:

class A {
public:
    void func1() {}
    //many more functions
};

template <typename T>
class Validator
{
public:
#if 1 // template way, but no-expressive signature
    template <typename F>
    void do_job(F f)
#else // type-erasure way, expressive, but with some overhead
    void do_job(std::function<void (T&)> f)
#endif
    {
        auto t = wptr.lock();
        if (t) {
            f(*t);
        } else {
            errorHandling();
        }
    }
private:
    void errorHandling();
private:
    std::weak_ptr<T> wptr;
};

所以用户可能会链式调用:

Validator<A> val;

val.do_job([](A& a)
    {
        a.func1();
        a.func2();
    });