static_cast用于用户定义的类型

时间:2011-09-05 21:06:53

标签: c++

是否可能以及为什么要这样做?

class Foo;
class Bar;

......

Foo foo;
Bar bar = static_cast<Bar>(foo);

通常,static_cast与数字类型和指针一起使用,但它是否可以与用户定义的数据类型一起使用,a.k.a类?

2 个答案:

答案 0 :(得分:11)

以下是规则:

当且仅当以下变量定义有效时,表达式static_cast<T>(e)才有效

T x(e);

其中x是一个发明变量。

因此,通常,两个不相关的类型不能相互转换。但是,如果一个类型派生自另一个类型,或者一个类型定义了另一个类型的转换函数,或者构造函数采用另一个类型的单个参数 - 在这些情况下,static_cast将被很好地定义。

它有意义吗?例如,如果T定义了一个构造函数,它接受一个U而构造函数是explicit,那么static_cast<T>(e)其中e是U类型将是完全合理的

答案 1 :(得分:10)

Bar bar = static_cast<Bar>(foo);

此演员表将失败。 FooBar是不兼容的类型,除非至少满足下列条件之一:

  • Foo派生自Bar,或
  • Bar有一个带Foo
  • 的构造函数
  • Foo具有用户定义的Bar转换。

这里更大的问题不是它是否会成功投射。更大和更实际的问题应该是:你想从这样的演员阵容中得到什么?你为什么要首先做这样的事情?该怎么办?我的意思是,如何从Bar对象初始化Foo对象?

将一种类型转换为另一种类型的合理方法是以下方式之一:

Foo定义为:

class Foo : public Bar
{
   //...
};

或将Bar定义为:

class Bar
{
  public: 
       Bar(const Foo &foo); //define this constructor in  Bar!
};

或者在Foo中提供转换功能:

class Foo
{
  public: 
       operator Bar(); //provide a conversion function Foo to Bar!
};