Czy istnieje sposób określenia typu zmiennej przekazanej do szablonu i wywołania funkcji na podstawie tego, czy jest to int
lub std::string
itd ...?Wykonywanie różnych metod w oparciu o zmienną typu szablonu
Na przykład
template <class T>
struct Jam
{
Jam(T *var)
{
if (typeid(var) == typeid(std::string*)
*var = "Hello!";
else if (typeid(var) == typeid(int*)
*var = 25;
}
};
Kiedy próbuję użyć tego kodu, pojawia się błąd invalid conversion from const char* to int
. Podejrzewam, że dzieje się tak dlatego, że kompilator "rozszerza" szablon na oddzielne funkcje i kiedy podałem nowe wystąpienie struktury throw Jam<std::string>(&setme);
, wykrył on oświadczenie var* = 25
i odmówił kompilacji.
Czy jest to właściwy sposób? Może z ochroną makr? Dzięki.
Istnieją inne alternatywy, jak na przykład specjalizowanie tylko konstruktora ('template <> Jam :: Jam (int * var) {}' poza definicją klasy szablonu) lub bardziej złożone SFINAE w celu włączenia/wyłączenia kodu na argumentach szablonu ... Nie sądzę, żeby miało to sens w tym prostym problemie, ale może mieć sens, gdy te proste rozwiązania staną się ciężarem (powiedzmy, że konstruktor zrobił 100 rzeczy, z których tylko jedna jest zależna od typu lub że było 100 innych funkcji składowych i specjalizacja całego typu byłaby kosztowna) –