大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE稳定放心使用
C++有一个很方便的功能—隐式转换,比如有一个函数
void func(double f);
调用它的时候
func(5);
func(5.0);
都是有效的。
但有时候,这个功能就很麻烦了。比如:
class A{
public:
A(const string&v){
///...
}
}
void func(const std::string& v);
void func(const A& v);
编译的时候就会出现错误,因为std::string可以隐式转换为类A对象。
那么如何阻止它呢?
C++ 标准有一条规定: “Implicit conversions will be performed […] if the parameter type contains no template-parameters that participate in template argument deduction” (ISO/IEC 14882:1998, section 14.8.1.4).
也就是说,既在模板参数列表中,又在函数参数列表中的类型不会隐式转换。也就是:
template<typename T> func(const T& t, double v);
///参数t不能隐式转换,参数v可以隐式转换
那么就可以如下写代码:
//.h
template<typename T> void func(const T&);
template<> dll_export void func<std::string>(const std::string& v);
template<> dll_export void func<A>(const A& v);
//.cpp
template<> dll_export void func<char*>(const char* s)
{
///...
}
template<> dll_export void func<A>(const A& v)
{
///...
}
这么写就可避免隐式转换了。
另外,c++11标准还添加一些相关内容,十分有用。
比如只想让这个func函数只接受int型的参数,就这么写。
void function(int); // 先声明int型的参数
template <class T>
void function(T) = delete; // C++11 ,禁止生成其他参数的func函数
c++选择函数时优先考虑满足条件的非模板函数,然后才是符合条件的模板函数。在上段代码中,非模板函数function会被优先考虑,而模板function函数被删除,所以不能被调用。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/183127.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...