- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
考虑以下情况:
#include <iostream>
template <class T> void f(T) { std::cout << "#1\n"; } // #1
template <> void f(const int) { std::cout << "#2\n"; } // #2
int main() {
f<const int>(1); // call #1
f<int>(1); // call #2
return 0;
}
#2 似乎是 f<int>(const int)
而不是 f<const int>(const int)
.这里发生了什么?我的第一个想法是顶级const
在函数类型转换中被丢弃,所以#2的类型是void(int)
,这导致了 f<int>(const int)
的特化.但我不确定。
为什么 C++ 允许这样的语法?我的意思是因为我们不能部分特化函数模板,如果我们想显式特化一个模板参数值,我们就会知道。那么,为什么 C++ 不只是强制程序员在专门化模板函数时显式提供模板参数值呢? (即我们必须在 template <> void f<int>(const int) { }
或 template <> void f<int const>(const int) { }
中编写 #1 的特化)除了编码方便之外,它是否有特殊用途?
最佳答案
void f(const int p)
暂时搁置模板问题,const
这里的部分没有指定f()
的参数类型.所有这些const
这里指定的是 p
是const
函数内部 f()
. f()
的参数类型是int
.
template <> void f(const int)
当编译器试图推导特化的类型时,它会推导出函数参数的类型是 int
。 , 这必须是 f<int>
的特化.
不能以这种方式真正进行演绎。你必须明确,如果那是你想做的:
template <> void f<const int>(const int) { std::cout << "#2\n"; }
关于c++ - 如何在函数模板的显式特化中推导模板参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39148717/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 4 年前。
正如您在 this travis.yml 中看到的那样文件,我的代码依赖于一些第三方库,我在构建项目之前将它们安装在远程系统上。 Travis 每次推送提交时都会下载并构建这些库,这可以避免吗?我的意
我是一名优秀的程序员,十分优秀!