能否重载 *static_cast* 运算符?

7
我定义了一个类A,实际属性并不重要。是否可能定义static_cast<class T>(int)此操作符的特化版本以将整数转换为类A?
到目前为止,我一直通过定义一个convert函数来实现这一点,如A convert(int)。但是我宁愿使用static_cast以保持与其他转换的一致性。
是否可能?
我还想避免隐式转换,这就是为什么我没有通过A的构造函数来实现这一点。
7个回答

10

static_cast 是一个关键字,因此您无法在其中进行重载或覆盖操作。如果您想提供控制整数如何转换为 class A 实例的代码,请编写格式为 A::A(int) 的适当构造函数。

更新:如果您想避免隐式转换,则可以将此构造函数设置为explicit。不知何故,我没有完全阅读问题的最后一句话,对此感到抱歉。


它是关键字这一事实是否相关?newdelete也是。 - Benjamin Lindley
3
newdelete 是操作符,它们之间有微妙的区别。 - Mark B

8
如果您只想避免隐式转换,为什么不使用 explicit 关键字呢?

7

static_cast是语言关键字,你无法改变它。但是你可以通过显式转换构造函数来实现你想要的功能:

class Foo
{
public:
    explicit Foo(int bar) { }  // Can't be called implicitly, CAN be invoked with `static_cast`.
};

这是因为语言将static_cast的行为定义为对象构建,在适当的情况下调用转换。


Foo的构造函数需要是公共的。此外,此解决方案不需要使用 static_cast,明确使用类型如 Foo(1)也可以起作用。 - oliora

2
如果类A有一个接受int类型参数的构造函数A(int),当你对int类型的对象使用static_cast<A>时,C++会调用这个构造函数进行转换。

为什么要使用A的构造函数将A转换为int - Benjamin Lindley
明确的声明并不能防止static_cast,只是隐式转换。 - R. Martinho Fernandes
@R.MartinhoFernandes:我明白了。我是在评论sharptooth的回答,仔细阅读了它。 - Benjamin Lindley
如果你写了static_cast,无论构造函数是否是explicit,都不会产生影响。 如果您编写static_cast<int>,则不会调用A的任何构造函数。 为了支持将A转换为int,您需要使用转换运算符。 - James Kanze

2
是和否。你不能定义一个operator static_cast(),但是static_cast总是会调用构造函数或转换运算符:为了支持从intMyClass的转换,需要为MyClass提供一个可以接受int的构造函数;为了支持从MyClassint的转换,需要为MyClass提供一个operator int() const函数。请保留HTML标签。

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?

但是你为什么要这样做呢?我没有看到这样做有任何优势;因此,我不鼓励你编写这样的函数模板。我只是为了实验和教育目的向你展示它。这样的代码不应该出现在真正的代码中。


0
为什么不使用一个接受 int 类型的构造函数呢?
struct MyInteger
{
    MyInteger(int i);
};

int main()
{
    MyInteger i = 1234;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接