功能上相同的是使用回调来自定义类行为,以及使用虚函数和继承。但我发现在我自己的工作中使用函数对象稍微灵活一些。
使用继承和许多类自定义行为
class Animal
{
virtual void onTouch() = 0 ;
} ;
class Dog : public Animal
{
void onTouch()
{
// all dogs behave this way.
// to change I'd need to subclass, or add parameters.
puts( "Woof" ) ;
}
} ;
使用函数对象按实例自定义类行为
struct Animal
{
function<void ()> onTouch ;
} ;
Animal dog1,dog2 ;
dog1.onTouch = dog2.onTouch = [](){
puts( "Woof" ) ;
} ;
Animal dog3 ;
dog3.onTouch = [](){
// slightly modified behavior from dog1 and dog2, without
// having to subclass, add members, or pass extra parameters
puts( "Arr.. Woof" ) ;
} ;
有没有人知道我在这里所做的事情或任何不使用它的理由