明确专门化功能模板的正确方法

用户名

我对函数的显式模板专门化的语法感到有些困惑。

假设我有以下几点:

template<class T> 
void f(T t)
{}

我知道对于显式专业化我需要提供template <>,否则我会超载。以下两个编译:

// (a)
template<> 
void f<int>(int t)
{}

//(b)
template<> 
void f(int t)
{}

但是,(a)和(b)有什么区别?

TC

如所写,两者都做相同的事情。模板参数推导用于确定T显式专业化中的类型当您具有重载功能模板时,将开始“乐趣”:

template<class T>         //#1
void f(T t)
{}

template<class T>         //#2
void f(T* t)
{}

template<> 
void f<int*>(int* t)      // specializes #1
{}

template<> 
void f(int* t)      // specializes #2, equivalent to void f<int>(int* t)
{}

更改订单后,真正的“乐趣”就会开始:

template<class T>         //#1
void f(T t)
{}

template<> 
void f(int* t)      // specializes #1, equivalent to void f<int*>(int* t)
{}

template<class T>         //#2
void f(T* t)
{}

在这种情况下,您得到与直觉相反的结果:

int *p;
f(p);              // calls #2, not explicitly specialized #1

这就是为什么对函数模板使用重载而不是显式专门化通常更好。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在模板化类中专门化方法的正确方法

来自分类Dev

C ++:数组的功能模板专门化

来自分类Dev

如何使用type_traits或模板功能专门化来巩固模板方法

来自分类Dev

如何使用type_traits或模板功能专门化来巩固模板方法

来自分类Dev

模板指向功能的部分模板专门化

来自分类Dev

名称空间中的功能模板专门化

来自分类Dev

如何测试是否存在模板功能专门化

来自分类Dev

无法在线程中专门化功能模板

来自分类Dev

显式模板专门化不能具有存储类-成员方法专门化

来自分类Dev

非模板类方法的条件模板专门化

来自分类Dev

不能明确地专门化

来自分类Dev

返回类型对方法模板的专门化

来自分类Dev

无法获取方法模板以进行专门化

来自分类Dev

根据方法来专门化模板

来自分类Dev

当类型是指针时,模板类方法专门化失败

来自分类Dev

返回类型对方法模板的专门化

来自分类Dev

最好的方法来专门化具有常规模板功能的std :: ostream和std :: vector的operator <<?

来自分类Dev

模板专门化和实例化

来自分类Dev

专门化此功能模板时,不能忽略模板参数

来自分类Dev

如何专门化模板子类?

来自分类Dev

模板专门化中的double template <>

来自分类Dev

如何专门化模板成员函数?

来自分类Dev

使用指令专门化的模板

来自分类Dev

模板成员变量专门化

来自分类Dev

模板成员函数专门化

来自分类Dev

模板类-成员函数专门化

来自分类Dev

部分模板专门化的意外结果

来自分类Dev

模板类-成员函数专门化

来自分类Dev

您如何专门化非模板化类中没有参数的模板化方法?