Sup*_*ock 52 c++ explicit implicit-conversion
我知道你可以使用C++关键字'explicit'作为类的构造函数来防止类型的自动转换.您是否可以使用相同的命令来阻止类方法的参数转换?
我有两个类成员,一个将bool作为参数,另一个是unsigned int.当我用int调用函数时,编译器将param转换为bool并调用错误的方法.我知道最终我将替换bool,但是现在不想破坏其他例程,因为这个新例程已经开发出来了.
Pat*_*yer 66
不,你不能使用显式,但你可以这样做:
#include <iostream>
struct Thing {
void Foo(int value) {
std::cout << "Foo: value" << std::endl;
}
template <typename T>
void Foo(T value) = delete;
};
Run Code Online (Sandbox Code Playgroud)
对于采用delete
或的每个方法重复此模式Thing::Foo
.不要为方法的模板化版本提供实现.
这将强制用户始终显式调用bool或unsigned int版本.
由于成员是私有的,任何尝试size_t
使用非类型bool
或unsigned int
将无法编译的类型的尝试,当然受制于可见性规则的标准例外(朋友,内部调用等).如果具有访问权限的内容调用私有方法,则会出现链接器错误.
以下是一个非常基本的包装器,可用于创建一个强大的typedef:
template <typename V, class D>
class StrongType
{
public:
inline explicit StrongType(V const &v)
: m_v(v)
{}
inline operator V () const
{
return m_v;
}
private:
V m_v; // use V as "inner" type
};
class Tag1;
typedef StrongType<int, Tag1> Tag1Type;
void b1 (Tag1Type);
void b2 (int i)
{
b1 (Tag1Type (i));
b1 (i); // Error
}
Run Code Online (Sandbox Code Playgroud)
这种方法的一个很好的特点是,您还可以区分具有相同类型的不同参数.例如,您可以拥有以下内容:
class WidthTag;
typedef StrongType<int, WidthTag> Width;
class HeightTag;
typedef StrongType<int, HeightTag> Height;
void foo (Width width, Height height);
Run Code Online (Sandbox Code Playgroud)
"foo"的客户会清楚哪个参数是哪个.
归档时间: |
|
查看次数: |
18600 次 |
最近记录: |