- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
#include <iostream>
#include <string>
#include "boost/operators.hpp"
using namespace std;
class simple_string : private boost::addable1<simple_string,
boost::addable2<simple_string, const char*> >
{
public:
simple_string() : m_str("Default")
{}
explicit simple_string(const char* s) : m_str(s)
{}
simple_string(const simple_string& rhs) : m_str(rhs.m_str)
{}
simple_string operator+=(const simple_string& rhs)
{
m_str += rhs.m_str;
return *this;
}
simple_string operator+=(const char* rhs)
{
this->operator+=(simple_string(rhs));
return *this;
}
friend ostream& operator<<(ostream& os, const simple_string& si)
{
os << si.m_str;
return os;
}
private:
string m_str;
};
int main(void)
{
simple_string s1;
simple_string s2(s1);
cout << "[before] s2: " << s2 << endl;
s2 += s1;
cout << "s2 += s1: " << s2 << endl;
simple_string s3 = s1 + s2;
cout << "s3: " << s3 << endl;
simple_string s4 = s3 + "Why";
simple_string s5 = "Now" + s3;
cout << "s4: " << s4 << endl;
cout << "s5: " << s5 << endl;
cout << "Now" + simple_string() << endl;
return 0;
}
输出
~/Documents/C++/boost $ g++ -o p123 p123.cpp
~/Documents/C++/boost $ ./p123
[before] s2: Default
s2 += s1: DefaultDefault
s3: DefaultDefaultDefault
s4: DefaultDefaultDefaultWhy
s5: DefaultDefaultDefaultNow
DefaultNow
~/Documents/C++/boost $
问题> 为什么生成的operator+(const char*, const simple_string&)
没有返回正确的结果?
例如,s5
的预期结果应该是 s5: NowDefaultDefaultDefault
"Now"+ simple_string()
的结果应该是 NowDefault
最佳答案
问题是对于字符串 operator+
是不可交换的,但是 boost 实现假定它是可交换的。请参阅 http://www.boost.org/doc/libs/1_32_0/libs/utility/operators.htm#symmetry 处的对称注释了解详情。
编辑:阅读实际的 boost 代码后,我认为我错了。您不能对 operator+
不可交换的类使用 boost 运算符生成,因为这是 boost 中的隐式假设。您必须自己实现。
基于(我相信)错误阅读文档的原始答案:
您可以强制使用不假定对称性的低效代码,如下所示:
...如果您的代码依赖于函数签名或严格的对称行为,您应该在您的用户配置中设置 BOOST_FORCE_SYMMETRIC_OPERATORS。这将强制使用对 NRVO 友好的实现,即使对于未实现 NRVO 的编译器也是如此。
关于c++ - boost::addable2 的用法 - 为什么从 operator+ 返回的结果是相反的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8646891/
我注意到Addable已弃用,而 Subtractable不是。 Addable 有什么问题,为什么 Subtractable 不同? 最佳答案 扩展 Daniel 的答案,+ 对于集合插入来说也是一
我在 Windows Vista 上使用 Visual Studio 2008,并将函数转换为构建为调试 DLL。 编译器错误: 我在使用 boost::operator 模板时遇到可访问性错误: e
假设我们要定义一个允许基本算术的类,称为“Addable”。可以添加可添加的东西。 abstract class Addable { public abstract Addable Add(Ad
我正在为错误程序编写一个插件,并且在使用 repaint() 方法时遇到问题。 简短的问题:有什么方法可以在 JPanel 重绘完成后立即获得通知或与其同步代码吗? 详细版本: 我的程序可以将 xy
我是一名优秀的程序员,十分优秀!