我已经定义了一个类 A ,实际属性是无关紧要的。是否可以定义static_cast<class T>(int)
运算符的特化以从整数转换为A类?
到目前为止,我一直在通过定义 convert 函数来完成此操作,例如A convert(int)
。但我宁愿使用static_cast
与其他转换保持一致。
有可能吗?
我也想避免隐式转换,这就是为什么我不是通过 A 的构造函数来做这件事。
答案 0 :(得分:10)
static_cast
是一个关键字,因此没有什么可以重载或覆盖那里。如果要提供控制整数转换为class A
实例的方式的代码,请编写A::A(int)
形式的适当构造函数。
更新:如果您想避免隐式转换,可以创建此构造函数explicit
。不知怎的,我没有完全阅读问题的最后一句,道歉。
答案 1 :(得分:8)
如果您只想避免隐式转换。为什么不使用显式关键字?
答案 2 :(得分:6)
static_cast
是一种语言关键字,您无法做任何改变。但是你可以使用显式转换构造函数来实现你的目标:
class Foo
{
public:
explicit Foo(int bar) { } // Can't be called implicitly, CAN be invoked with `static_cast`.
};
这是有效的,因为语言根据对象构造定义static_cast
的行为,并根据需要调用转换。
答案 3 :(得分:2)
如果A
有一个A(int)
转化构造函数,当您对static_cast<A>
类型的对象使用int
时,它将由C ++调用。
答案 4 :(得分:2)
是和否。您无法定义operator static_cast()
,但是
static_cast
将始终调用构造函数或转换
运营商:支持int
到MyClass
,向MyClass
提供
可以用int
调用的构造函数;支持MyClass
int
,为MyClass
提供operator int() const
功能。
答案 5 :(得分:1)
是否可以定义static_cast(int)运算符的特化,以便从整数转换为A类
没有。 static_cast
是关键字,而不是模板或功能。
但是,在您的班级A
中,如果您想要这种行为,可以编写一个带int
的构造函数。
struct A
{
A(int i) {}
};
A a = 10; //automatic conversion!
或者如果你想要一些看起来像演员表的语法糖,那么你可以这样做:
template<typename To, typename From>
To type_cast(From from)
{
return To(from);
}
然后将其用作:
A a = type_cast<A>(10); //but why would you do that?
但你为什么要那样做?我认为这样做没有任何好处;所以我不鼓励你写这样的功能模板。我只是出于实验和教育目的向你展示。这样的代码不应该在实际代码中找到。
答案 6 :(得分:0)
为什么不使用构造函数取int
?
struct MyInteger
{
MyInteger(int i);
};
int main()
{
MyInteger i = 1234;
}