Code: Alles auswählen
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)));
}
als Variadics. Das ganze läuft bestens, sofern ich die Abhängigkeiten immer über den Typen auflösen
kann, die ich zuvor registriert habe. Hier mal mein Google-Test Snipped hierzu:
Code: Alles auswählen
TEST(brIOCContainerTest, wire)
{
brIOCContainer container;
container.registerType<Armament>();
container.registerByContract<Rifle, Gun>();
container.registerByContract<GrenadeLauncher, Gun>();
container.wire<Armament, Rifle, GrenadeLauncher>();
auto r1 = container.resolve<Armament>();
ASSERT_NE(nullptr, r1.get());
ASSERT_NE(nullptr, r1->getPrimaryWeapon().get());
ASSERT_NE(nullptr, r1->getSecondaryWeapon().get());
ASSERT_NE(r1->getPrimaryWeapon(), r1->getSecondaryWeapon());
}
Und genau hier ist der Kasus-Knacksus. Irgendwie sehe ich aktuell keine Möglichkeit dies zu realisiern. Das Problem ist der Lambada Ausdruck zum Erzeugen der konkreten Instanz:
Code: Alles auswählen
auto delegate = [this]() -> T * {
return new T(this->resolve<D>()...);
};
Code: Alles auswählen
template <typename D>
void resolve(const D& dependency) {}
Hatte daher auch gedacht ich könnte evtl. aus dem Variadic Parameter-Packing eine Initializer-Liste aufbauen und die übergeben. Aber auch das geht nicht, da diese soweit ich das gesehen habe, keine unterschiedlichen Datentypen erlaubt ...
Hat jemand von Euch eine Idee wie man das Problem lösen kann? Ist es überhaupt möglich?