나는 내 IOCContainer위한 공장 대의원 펑 만들려면 다음 템플릿 기반의 방법했습니다 :가변 인자 템플릿 패키지 팩
template <typename T, typename ... D>
void wire(void)
{
std::type_index type = typeid(T);
auto iter = m_repository.begin();
while(iter!=m_repository.end()){
if((iter->first) == type ||
(iter->second)->getType() == type){
break;
}
iter++;
}
auto delegate = [this]() -> T * {
return new T(this->resolve<D>()...);
};
auto component = iter->second;
component->setResolver(std::shared_ptr<Resolver>(new DelegateResolver<T>(delegate, this)));
}
는 새로운 임시 객체 인스턴스를 만들 수있어이 방법을 종속성은 대리자를 만들 때 동적으로 확인됩니다. 어떤 유형의 종속성에 대해서도 정확하게 해결 된 경우 이 올바르게 작동합니다.
그러나 이름으로 참조 할 수있는 계약 (인터페이스의 구체화 또는 추상 클래스)으로 등록 된 유형도 있습니다. 이러한 이유로 종속성 배선에 대한 매개 변수도 고려해야합니다. . 어떻게 보관할 수 있습니까?
우선은 내가 필요한 매개 변수 를 보유하고 해결에 매개 변수로 설정 될 수 내 종속성을 간단한 템플릿을 사용하여 생각했습니다 :이 템플릿의
template <typename D>
void resolve(const D& dependency) {}
구현은 간단합니다. 그리고 나는 그 종속 와이어 나에게 를 allowes 추가 템플릿 기능을 작성할 수 있습니다
template <typename T, typename ... D>
void wire(const D&... dependencies)
{}
을하지만 어떻게 위임 펑터 생성에 해결 통화에서 가변 인자 템플릿 매개 변수 팩을 압축을 풀 수 있을까? 다음과 같이 해결 전화를 받으려면 다음과 같이하십시오.
auto delegate = [this]() -> T * {
return new T(this->resolve<D>(D)...);
};
아이디어가 있으십니까? 방금 인수로 dependency
을 보낼 필요가 같은
같은 방법으로 ['표준 : forward'] (http://en.cppreference.com/w/cpp/utility/forward) :'new T (this-> resolve (dependencies) ...)' –
firda