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
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.
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ą).
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.