是否可以重载* static_cast *运算符?

时间:2011-12-08 14:37:53

标签: c++ casting

我已经定义了一个类 A ,实际属性是无关紧要的。是否可以定义static_cast<class T>(int)运算符的特化以从整数转换为A类?

到目前为止,我一直在通过定义 convert 函数来完成此操作,例如A convert(int)。但我宁愿使用static_cast与其他转换保持一致。

有可能吗?
我也想避免隐式转换,这就是为什么我不是通过 A 的构造函数来做这件事。

7 个答案:

答案 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将始终调用构造函数或转换 运营商:支持intMyClass,向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;
}