Bu yazıda iki tane amaç var
1. Template metodu bir parametre tipi için template kullanmadan overload etmek
2. Parametre tipine göre doğru template metodu seçmek
1. Template metodu bir parametre tipi için overload etmek
Örnek - Template Olmayan Overload
Açıklaması şöyle
Non template functions are (let me say) preferred over function templates, thus you can easily got what you pay for in your code with an old plain function.
Şöyle yaparız
template <class T>
int HelloFunction(const T &a) {
std::cout << "Hello: " << a << std::endl;
return 0;
}
int HelloFunction(const char *a) {
std::cout << "Hello: " << a << std::endl;
return 0;
}
int main() {
HelloFunction(1);
HelloFunction("char");
return 0;
}
Template olan overload derlenmez! Elimizde şöyle bir kod olsun
template <class T>
int HelloFunction(const T& a)
{
std::cout << "Hello: " << a << std::endl;
return 0;
}
template <>
int HelloFunction(const char* & a)
{
std::cout << "Hello: " << a << std::endl;
return 0;
}
int main()
{
HelloFunction(1);
HelloFunction("char");
return 0;
}
error: template-id 'HelloFunction<>' for 'int HelloFunction(const char*&)' does not match
any template declaration
Eğer metod parametresi de generic tip olsaydı derlenirdi. Şu kod derlenir
template<typename T>
struct ABC {
T type;
ABC(T inType) : type(inType) {}
};
template <class T>
int HelloFunction(ABC<T>& a)
{
std::cout << "Hello: " << a.type << std::endl;
return 0;
}
template <>
int HelloFunction(ABC<const char*> & a)
{
std::cout << "Hello: " << a.type << std::endl;
return 0;
}
int main()
{
HelloFunction(ABC<int>(1));
HelloFunction(ABC<const char*>("char"));
return 0;
}
Örnek
Şöyle yaparız. Bu kodda T tipi parametre olarak kullanılıyor
template <class T>
T foo<T>(T val) { return someFunc(val); }
template <>
bool foo<bool>(bool val) { return otherFunc(val); };
Eğer foo metodunun Bar için derlenmemesini istersek şöyle yaparız.
template <>
Bar foo<Bar>(Bar val) = delete;
Parametre tipine göre doğru template metodu seçmek
Bu yöntemte std::enable_if kullanılır
Hiç yorum yok:
Yorum Gönder