class A
{
public:
    int x;
    //create a vector of functors in B and C here
};

class B
{
public:
    struct bFunctor
    {
        void operator()() const
        {
            //some code
        }
    };
};

class C
{
public:
    struct cFunctor
    {
        void operator()() const
        {
            //some code
        }
    };

};

void main()
{
 A obj;
 //iterate through the vector in A and call the functors in B and C
}

我的问题是在 vectorA 中调用 functorsB 类中的 C 格式应该是什么?或者是在 functor 中有一个基本 A 并使 functorsB 中的 C 从中派生的唯一方法?或者有更好的方法吗?

最佳答案

基本上有两种方法可以解决这个问题(我可以想到 ATM):
注意:在这两种情况下,我都会将 cFunctorbFunctor 重命名为简单的 Functor。它们嵌套在各自的类中,因此这样的前缀没有什么意义。
类型已删除
类型删除的示例是 std::function

class A {
public:
    int x;
    std::vector<std::function<void(void)>> functors;

    A() : functors { B::bFunctor(), C::cFunctor() }
    { }
};
如果您需要仿函数具有更高级的行为, Boost.TypeErasure any 可能会有所帮助。
多态
  • 创建一个抽象仿函数类型。
  • 使 B::bFunctorC::cFunctor 继承它。
  • 存储该抽象仿函数类型智能指针的 vector
  • struct AbstractFunctor {
        virtual void operator()() const = 0;
    };
    
    class B {
    public:
        struct Functor : public AbstractFunctor {
           void operator()() const {
           //some code
           }
        };
    };
    
    class A {
    public:
        int x;
        std::vector<std::unique_ptr<AbstractFunctor>> functors;
    
        A() {
            // this could most probably be shortened with make_unique
            functors.emplace_back(std::unique_ptr<AbstractFunctor>(new B::Functor()));
            functors.emplace_back(std::unique_ptr<AbstractFunctor>(new C::Functor()));
        }
    };
    

    关于C++ 如何创建一个 std::vector 的仿函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17864064/

    10-13 06:28