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
}
我的问题是在
vector
和 A
中调用 functors
的 B
类中的 C
格式应该是什么?或者是在 functor
中有一个基本 A
并使 functors
和 B
中的 C
从中派生的唯一方法?或者有更好的方法吗? 最佳答案
基本上有两种方法可以解决这个问题(我可以想到 ATM):
注意:在这两种情况下,我都会将 cFunctor
和 bFunctor
重命名为简单的 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::bFunctor
和 C::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/