나는 작업중인 템플릿 기반 팩토리 시스템을 작성했습니다. 이 내가 가진 함수 템플릿의 일부 서명입니다 : 보시다시피템플릿 기반 팩토리 시스템 작성
template <typename Interface, typename... Args>
void register_factory(identifier id, function<shared_ptr<Interface> (Args...)> factory);
template <typename Interface, typename... Args>
void unregister_factory(identifier id);
template <typename Interface, typename... Args>
shared_ptr<Interface> create(identifier id, Args... args);
, 내가 포기해야 내가 공장 기능을 저장하는 변수에 액세스해야하기 때문에 내 모든 기능은 typename... Args
인수를 템플릿 :
template <typename Interface, typename... Args>
struct factory_storage {
static map<identifier, function<shared_ptr<Interface> (Args...)> factories;
};
그러나 논리적으로, 나는 (동일한 서명이 동일한 인터페이스에 대한 모든 공장 기능을) 다른 곳 충분해야 Interface
을 알고, register_factory
및 create
을위한 사람들을하기 만합니다. 실제로 std::function
대신 void*
을 사용한 경우 내 코드에서 typename... Args
의 대부분을 제거 할 수있었습니다.
유형 안전성을 유지할 수있는 방법이 있습니까? std::function
또한 혼란을 피하십시오. 나는 typename...
인수를 저장하는데 사용 된 std::tuple
을 보았고, 그것들은 내 문제에 대한 하나의 가능한 해결책이 될 수 있었지만 지나치게 복잡해 보였고 나는 그것을 피할 수 있기를 바라고있다.
[관련있을 수 있습니다] (http://stackoverflow.com/questions/18251815/creating-an-array-initializer-from-a-tuple-or-variadic-template-parameters), 나는 그것을 해결하는 데 사용 비슷한 문제. –
사용자는'id'와'Args' 타입의 매치를 기억해야하기 때문에 단순한'identifier id '대신'Interface'와'Args'를 기반으로 템플릿 클래스 ID를 반환하는 것이 합리적입니까? – Jarod42
어쨌든'std :: function (Args ...)'함수 타입을 만들 필요가 있습니다. 템플릿 인자로 Interface와 Args를받지 못하면 어떻게 그 타입을 만들 수 있습니까? –
Elektito