所以你想使用预处理器宏,对吧?有接缝不好,但我经常使用它们。这个答案将基于命令注册表:
class Command
{
public:
Command(std::string const& _name):name(_name){ registry[_name]=this; }
virtual ~Command() { registry.erase(name); }
static void execute( std::string const& name ) {
RegistryType::iterator i = registry.find(name);
if(i!=registry.end()) i->second->_execute();
//some exeption code here
}
protected:
virtual void _execute() = 0;
private:
const std::string name;
typedef std::map< std::string, Command* > RegistryType;
static RegistryType registry;
};
有一些静态注册表应该在标题以外的地方:
Command::RegistryType Command::registry;
让我们看看我们需要什么(稍微改变一下更简单):
COMMAND_ARG( doSomething )
{
cout << "Something to do!" << std::endl;
}
所以我们需要创建一个类的一些对象,它继承自 Command 并实现了_execute
方法。由于方法可以在类之外定义,这个宏将包含所有需要的代码,并使用括号中的代码:
class CommanddoSomething : public Command {
public:
CommanddoSomething () : Command( "doSomething" ) {}
private:
virtual void _execute();
} commanddoSomething;
void CommanddoSomething :: _execute()
{
cout << "Something to do!" << std::endl;
}
所以这是一个宏的完美位置:
#define COMMAND_ARG( NAME ) \
class Command ## NAME : public Command { \
public: Command ## NAME () : Command( #NAME ) {} \
private: virtual void _execute(); \
} command ## NAME; \
void Command ## NAME :: _execute()
我希望你喜欢它。