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 func(const T& t, double v);
///参数t不能隐式转换,参数v可以隐式转换
那么就可以如下写代码:
//.h
template void func(const T&);
template<> dll_export void func(const std::string& v);
template<> dll_export void func(const A& v);
//.cpp
template<> dll_export void func(const char* s)
{
///...
}
template<> dll_export void func(const A& v)
{
///...
}
这么写就可避免隐式转换了。
另外,c++11标准还添加一些相关内容,十分有用。
比如只想让这个func函数只接受int型的参数,就这么写。
void function(int); // 先声明int型的参数
template
void function(T) = delete; // C++11 ,禁止生成其他参数的func函数
c++选择函数时优先考虑满足条件的非模板函数,然后才是符合条件的模板函数。在上段代码中,非模板函数function会被优先考虑,而模板function函数被删除,所以不能被调用。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/hz/140310.html