作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
假设如下:
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,2,3(显式实例化与隐式调用相同) .
关于c++ - 具有重载的显式模板函数特化 : Why would you do it?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27280840/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 4 年前。
正如您在 this travis.yml 中看到的那样文件,我的代码依赖于一些第三方库,我在构建项目之前将它们安装在远程系统上。 Travis 每次推送提交时都会下载并构建这些库,这可以避免吗?我的意
我是一名优秀的程序员,十分优秀!