微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c – 带有重载的显式模板函数特化:你为什么要这样做?

假设如下:
template <typename T> void foo (T*);   // #1
template <typename T> void foo (T);    // #2
template <> void foo (int*);           // #3

当引入也具有重载的基本模板的显式特化时,在设计的重载解析期间不考虑特化.我理解这一点.

但是,鉴于我可以使#3成为非模板重载,然后考虑重载解析,为什么我仍然想要像上面那样做呢?上面说明的设置是否有一个有效的用例?我唯一能想到的是,如果您不依赖于模板类型推导,则无法使用非模板函数,因为它们不接受<>调用它们时的语法.

顺便说一下,我只审查了C 03的规则.我不确定C 11是否/如何改变这些规则/行为.

解决方法

基本上,我倾向于专业化以避免最不意外的原则.您希望允许显式或非显式地调用函数支持在尽可能多的代码中使用…并且在显式实例化时,它应该与不存在时的行为相同.

以下模板函数是您可能希望显式选择要调用哪个函数的示例(尽管所有3个函数都采用相同的参数).

template <typename T> void foo (T*){std::cout << 1 << std::endl;}   // #1
template <typename T> void foo (T){std::cout << 2 << std::endl;}    // #2
template <> void foo<int> (int* x){std::cout << 3 << std::endl;}    // #3
//void foo (int*){std::cout << 3 << std::endl;}           // #3

template <typename T>
void bar(void* x) {
   foo<T>(reinterpret_cast<T*>(x));
   foo<T*>(reinterpret_cast<T*>(x));
   foo(reinterpret_cast<T*>(x));
}


int main()
{
   cout << "Hello World" << endl; 
   bar<int>(NULL);
   return 0;
}

如果没有专门化,则输出1,2,3(显式实例化的调用与重载调用不同),而使用特殊化则获得3,3(显式实例化与隐式调用相同).

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐