2009-03-03 20 views
8

Załóżmy, że mam zestaw funkcji i klas, które są szablonem do używania precyzji pojedynczej (float) lub double. Oczywiście mógłbym napisać tylko dwa kawałki kodu bootstrap lub bałagan z makrami. Ale czy mogę zmienić argument szablonu w czasie wykonywania?Wybierz argument szablonu w czasie wykonywania w C++

Odpowiedz

19

Nie, nie można przełączać argumentów szablonu w czasie wykonywania, ponieważ szablony są tworzone przez kompilator podczas kompilacji. Co ty może zrobić, to mieć oba szablony wywodzą się ze wspólnej klasy bazowej, zawsze użyć klasy bazowej w kodzie, a następnie zdecydować, który pochodzi klasę używać w czasie wykonywania:

class Base 
{ 
    ... 
}; 

template <typename T> 
class Foo : public Base 
{ 
    ... 
}; 

Base *newBase() 
{ 
    if(some condition) 
     return new Foo<float>(); 
    else 
     return new Foo<double>(); 
} 

Makra mają ten sam problem jak szablony, ponieważ są one rozwijane podczas kompilacji.

3

Szablony są mechanizmem kompilacji. BTW, makra są również (ściśle mówiąc - mechanizmem przetwarzania wstępnego - który pojawia się nawet przed kompilacją).

2

Szablony są wyłącznie kompilacją, kompilator rozwinie szablon i utworzy klasę/funkcję z określonym argumentem i bezpośrednio przetłumaczy go na kod.

Jeśli próbujesz przełączać się między foo<float> i foo<double> w czasie wykonywania, będziesz musiał użyć sztuczki metaprogramowania lub po prostu mieć osobne ścieżki dla każdego z nich.

Powiązane problemy