投与直接呼叫转换运营商?

考虑下面的类,就像一个简单的例子:

#include <iostream>
#include <string>
using namespace std;

class point {
public:
    int _x{ 0 };
    int _y{ 0 };

    point() {}
    point(int x, int y) : _x{ x }, _y{ y } {}
    operator string() const
        { return '[' + to_string(_x) + ',' + to_string(_y) + ']'; }

    friend ostream& operator<<(ostream& os, const point& p) {

        // Which one? Why?
        os << static_cast<string>(p); // Option 1
        os << p.operator string();    // Option 2

        return os;
    }
};

应该直接调用一个转换操作符,还是只需调用static_cast并让它完成这项工作?

这两行几乎完全相同(即调用转换操作符),就我所知,它们的行为之间并没有真正的区别。 所以这里真正的问题是这是否是真的。 尽管这些看起来与我一样,但仍然可能存在微妙的差异,人们可能无法接受。

那么这些方法(包括那些可能不适用于这个例子的方法)之间是否存在实际差异,除了它们的语法不同之外呢? 哪一个应该是首选,为什么?


那么这些方法之间是否存在实际差异?

在这种情况下,不是我所知道的,行为明智的。

(包括那些可能不适用于这个例子的)

如果X具有类型Y的转换构造函数, static_cast<X>(instance_of_Y)也将允许转换。 对Y (可能不存在)的转换运算符的显式调用无法使用所提到的转换构造函数。 当然,在这种情况下, std::string没有针对point的转换构造函数。

所以,演员阵容更通用,这就是我一般喜欢的。 “将此对象转换为string类型”比“调用操作符string() ”更有意义。 但是,如果出于某种非常奇怪的原因想要避免转换构造函数,那么显式调用转换运算符将实现该功能。


不,你不需要直接调用转换操作符成员函数。

如果您使用的类的实例需要一个std::string对象,那么转换操作符将被编译器自动调用,如果您使用static_cast将实例转换为std::string ,那么它也会自动调用。

简单而愚蠢的例子:

void print_string(std::string const& s)
{
    std::cout << s << 'n';
}

int main()
{
    point p(1, 2);

    print_string(p);  // Will call the conversion operator
    print_string(static_cast<std::string>(p));  // Will call the conversion operator too
}

直接调用函数最接近您将需要使用类似static_cast


在你的具体情况下,使用输出操作符,那么你应该使用static_cast 。 原因是语义上的,以及将来的读者和维护者(可能包括你自己)的代码。

它当然会直接调用转换成员函数(您的选项2),但它丢失了“在这里我将对象转换为字符串”的语义信息。

如果在输出运算符中只使用转换运算符,则最好创建一个将输出流引用作为参数的(专用)函数,并直接写入流中,然后从输出中调用该函数运营商。

链接地址: http://www.djcxy.com/p/61645.html

上一篇: cast vs. direct call to conversion operator?

下一篇: Different cast operator called by different compilers