자동으로 등록되는 새 기능을 정의하려면 매크로를 사용하십시오.
// callable_function.h
class CallableFunction {
public:
virtual void operator()() = 0;
};
class CallableFunctionRegistry {
public:
static CallableFunction *Register(const string &func_name,
CallableFunction *func_impl) {
Instance()->registered_functions_.insert(make_pair(func_name, func_impl));
}
static void Run(const string &func_name) {
(*Instance()->registered_functions_[func_name])();
}
private:
static CallableFunctionRegistry *Instance() {
static CallableFunctionRegistry *instance = new CallablefunctionRegistry;
return instance;
}
CallableFunctionRegistry() {}
map<string, CallableFunction*> registered_functions_;
};
#define REGISTER_CALLABLE_FUNCTION(FuncName) \
class FuncName : public CallableFunction { \
public: \
virtual void operator()(); \
}; \
CallableFunction *impl_ ##FuncName = \
CallableFunctionRegistry::Register(#FuncName, new FuncName); \
void FuncName::operator()()
그리고 그것을 사용과 같은 :
//other_file.cc
REGISTER_CALLABLE_FUNCTION(DoStuff) {
// do stuff here.
}
을 그리고이 :
//yet_another_file.cc
CallableFunctionRegistry::Run("DoStuff");
당신은 기능을 할 수있는 대신 CallableFunction 객체의 ptrs,하지만 내 구문은 불투명하다. 어느 쪽이든, 중복 등록에 대한 오류 검사를 추가하고 조회를 찾을 수 없습니다.
와우, 내가이 코드를 정확히 사용하지 않았을지라도 나는 나를 나중에 다른 목표로 이끄는 또 다른 길로 인도했다. 답장과 정보에 대해 대단히 감사합니다. – Undawned
행운을 빌어서 도울 수있어서 기쁩니다. – Stephen