另一个方向的隐式转换

Implicit conversion in the other direction

本文关键字:转换 方向 另一个      更新时间:2023-10-16

当不能修改包装的类时,包装类是很好的。使用包装器,我可以添加某些功能和便利性,并且通过使用从包装器到包装类型的隐式转换,仍然可以使使用包装类型的函数接受包装器。像这样:

struct vec {
    __m128 m128;
    inline operator __m128 &() {
        return m128;
    }
    //convenience to add functionality related to the wrapped variable inserted here
}

这个效果很好。

现在我的问题是,当您无法访问包装类型源或无法修改它时,您是否可以隐式地转换其他方式,从__m128到vec ?

是的,只要写一个构造函数,取一个不标记为explicit__m128:

vec (__m128 m128) //maybe take by const-ref (I don't know what __m128 is)
  : m128(m128)
{}

您可以添加一个构造函数,(1)接受单个__m128参数。如果不添加explicit,则它提供隐式转换。这被称为转换构造函数。c++ 03 12.3.1/1

没有函数说明符 explicit的构造函数声明可以用单个形参调用,指定从其第一个形参的类型转换为其类的类型。这样的构造函数称为转换构造函数。

c++ 11(相当不合理,恕我冒昧)扩展了该术语的含义,以涵盖转换。从多个指定参数,到构造函数类的类型:

11 12.3.1/1 c++

未声明函数说明符的构造函数 explicit指定了从其类型的转换参数设置为其类的类型。这种构造函数称为转换构造函数


<一口>1)如果它有更多的参数,那么这些必须是默认的或...省略号。