既然可以使用函数引用,为什么还要使用函子呢
Why use a functor when you can use a function reference
例如,假设您想要执行工厂模式。为什么这样做:
class IFooFactory {
public:
virtual ~IFooFactory() {}
virtual std::unique_ptr<IFoo> operator()(int bar, int baz) const = 0;
};
class AFactory : public IFooFactory {
public:
virtual std::unique_ptr<IFoo> operator()(int bar, int baz) const override {
std::unique_ptr<IFoo> a(new A(bar, baz));
return a;
}
};
class BFactory : public IFooFactory {
public:
virtual std::unique_ptr<IFoo> operator()(int bar, int baz) const override {
std::unique_ptr<IFoo> b(new B(bar, baz));
return b;
}
};
void doStuff() {
std::unique_ptr<IFooFactory> fooFactory(new BFactory);
doMoreStuff(fooFactory);
}
当你可以做到这一点:
typedef std::unique_ptr<IFoo> (&FooFactory)(int bar, int baz);
std::unique_ptr<IFoo> AFactory(int bar, int baz) {
std::unique_ptr<IFoo> a(new A(bar, baz));
return a;
}
std::unique_ptr<IFoo> BFactory(int bar, int baz) {
std::unique_ptr<IFoo> b(new B(bar, baz));
return b;
}
void doStuff() {
doMoreStuff(BFactory);
}
第一种解决方案的优点是什么?对我来说,这看起来像是复杂的OO垃圾。
在您的示例中,AFactory
和BFactory
都不使用本地状态。例如,创建B
可能需要向工厂的构造函数提供额外的参数,而第二种解决方案将出现问题:
class BFactory : public IFooFactory {
int zoo;
public:
BFactory(int zoo): zoo(zoo) {}
virtual std::unique_ptr<IFoo> operator()(int bar, int baz) const override {
std::unique_ptr<IFoo> b(new B(bar, baz, zoo));
return b;
}
};
如果你知道工厂里不需要当地州,那么选择更简单的格式更好。
使用函子意味着您将在对象(某个类的实际实例)上调用方法,而不是调用没有上下文的简单函数。这意味着调用的结果可能由对象的状态决定。
方法指针也可以这样做,但您必须将方法指针和传递给要调用该方法的对象。
使用函子,您只需要传递对象,这通常更可读。
相关文章:
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- C++:如何使函数只返回作为列表一部分的字符串
- 是否可以将函数导入命名空间,但不能导出它?
- 有没有一种技术可以使虚函数在所有派生类中强制重写?
- 有没有一种方法可以使全局函数/静态成员函数一次可呼出
- 编写一个可以使二维数组平坦的函数
- 是否可以使函数模板从函数引用中获取“decltype”
- 是否可以使函数模板对不适当的类型而不是错误执行默认操作
- 是否可以使程序的执行跳过 fprintf-语句/如何创建我自己的 fprintf 函数
- 是否有一个内置函数可以使线程的一部分不并发运行
- 是否有某种方法可以使C ++类中的一个函数在不同的线程中运行
- 是否可以使函数接受给定参数的多种数据类型
- 如何使函数中的变量可以被主函数访问
- 有哪些技巧可以使包含大量计算的函数简洁
- 当我向只接受无符号整数的函数提供有符号整数时,是否有一种方法可以使GCC警告我?
- 我可以修改函数包装器使其使用旧值吗?
- 我可以使函数"外部"c""吗?
- 是否有一种方法可以使c++析构函数被急切地调用
- 在 c++ 中是否有任何方法可以使一个类的函数,每个类的对象都为该函数做不同的事情?
- 是否可以使函数对于常量参数或变量参数的行为不同