繁体   English   中英

如何让MyClass与std :: string的operator +一起使用

[英]How to get MyClass to work with std::string's operator+

我尝试了隐式转换,但这不起作用。

#include <string>
#include <iostream>

struct MyClass
{
    operator std::string() { return "bar"; }
};

int
main( int argc, char* argv[] )
{
    MyClass x;

    std::cout << std::string( "foo" ) + x << std::endl;
    return 0;
}

隐式转换将不起作用,因为已对字符串的operator+进行了模板化,并且需要推导模板参数。 这看起来像是对正在发生的事情的更好的解释: https : //stackoverflow.com/a/8892794/964135

我只是进行强制转换或编写非模板operator+


一个愚蠢的解决方案是不推断类型,然后它将进行隐式转换:

std::cout << std::operator+<char, std::char_traits<char>, std::allocator<char> >(std::string( "foo" ), x) << std::endl;

您是否尝试过重载+运算符?

std::string operator+(std::string& str, MyClass& x){
    return str + "bar"
} 

这将是一个免费功能,而不是MyClass的一部分。 此外,也可能需要使交换情况过载。 如果不重要,你可以用上面的表达来表达它。

对于Karthik T和Pubby给出的关于重载operator+()的好答案,我想补充一点。

通常,您将需要在重载的operator+()代码内访问MyClass私有成员(与return "bar";就像您大概剥离的示例一样)。 在这种情况下,您需要将其声明为friend 你不能将operator+()作为MyClass的成员,因为MyClass位于operator +的左侧。 请参阅下面的示例代码。

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

struct MyClass {
public:
    MyClass() : bar("bar") {}
    friend string operator+(string& str, MyClass& x);
private:
    string bar;
};

string operator+(string& str, MyClass& x) {
    return str + x.bar;
}

int main( int argc, char* argv[] )
{
    MyClass x;
    string foo("foo");

    std::cout <<  foo + x << std::endl;
    return 0;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM