2014-05-25 4 views
1

나는 작업중인 템플릿 기반 팩토리 시스템을 작성했습니다. 이 내가 가진 함수 템플릿의 일부 서명입니다 : 보시다시피템플릿 기반 팩토리 시스템 작성

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_factorycreate을위한 사람들을하기 만합니다. 실제로 std::function 대신 void*을 사용한 경우 내 코드에서 typename... Args의 대부분을 제거 할 수있었습니다.

유형 안전성을 유지할 수있는 방법이 있습니까? std::function 또한 혼란을 피하십시오. 나는 typename... 인수를 저장하는데 사용 된 std::tuple을 보았고, 그것들은 내 문제에 대한 하나의 가능한 해결책이 될 수 있었지만 지나치게 복잡해 보였고 나는 그것을 피할 수 있기를 바라고있다.

+0

[관련있을 수 있습니다] (http://stackoverflow.com/questions/18251815/creating-an-array-initializer-from-a-tuple-or-variadic-template-parameters), 나는 그것을 해결하는 데 사용 비슷한 문제. –

+0

사용자는'id'와'Args' 타입의 매치를 기억해야하기 때문에 단순한'identifier id '대신'Interface'와'Args'를 기반으로 템플릿 클래스 ID를 반환하는 것이 합리적입니까? – Jarod42

+0

어쨌든'std :: function (Args ...)'함수 타입을 만들 필요가 있습니다. 템플릿 인자로 Interface와 Args를받지 못하면 어떻게 그 타입을 만들 수 있습니까? – Elektito

답변

1

std::function의 서명 수가 고정되어있는 경우 variant (Boost)이 가능한 솔루션입니다.

+0

그건 사실이 아니야, 나는 두렵다. 이 라이브러리는 나중에 사용할 방법에 대한 제어권이 없습니다. – Elektito