2014-08-28 2 views
0

나는 내 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을 보낼 필요가 같은

+0

같은 방법으로 ['표준 : forward'] (http://en.cppreference.com/w/cpp/utility/forward) :'new T (this-> resolve (dependencies) ...)' – firda

답변

1

그것은 소리 : 사용으로

auto delegate = [this]() -> T * { 
    return new T(this->resolve(dependency)...); 
}; 
+0

예외 안전을 위해서'std :: make_shared'를 사용해야합니다. – 0x499602D2

+0

나는 이것도 먼저 생각했다. 그러나 그것은 효과가 없습니다. 이 표현식을 사용하면 종속성이 캡처되지 않는 컴파일러 오류가 발생합니다. – Hellhound

+0

@Hellhound '&'를 사용하여 캡처를 시도하십시오. – 0x499602D2