相关疑难解决方法(0)

为什么C++编译器没有定义operator ==和operator!=?

我非常喜欢让编译器为你做尽可能多的工作.在编写一个简单的类时,编译器可以为"free"提供以下内容:

  • 默认(空)构造函数
  • 复制构造函数
  • 析构函数
  • 赋值运算符(operator=)

但它似乎无法给你任何比较运算符 - 如operator==operator!=.例如:

class foo
{
public:
    std::string str_;
    int n_;
};

foo f1;        // Works
foo f2(f1);    // Works
foo f3;
f3 = f2;       // Works

if (f3 == f2)  // Fails
{ }

if (f3 != f2)  // Fails
{ }
Run Code Online (Sandbox Code Playgroud)

有这么好的理由吗?为什么执行逐个成员比较会成为问题?显然,如果类分配内存然后你要小心,但对于一个简单的类肯定编译器可以为你做这个?

c++ operators

286
推荐指数
11
解决办法
8万
查看次数

通过'tuple'和'tie'实现比较运算符,这是一个好主意?

(注意:tuple并且tie可以从Boost或C++ 11中获取.)
当编写只包含两个元素的小结构时,我有时倾向于选择a std::pair,因为所有重要的东西都已经为该数据类型完成,例如operator<严格弱序.
但缺点是几乎没用的变量名.即使我自己创造了这个typedef,我也不会记得2天后究竟是什么first,second究竟是什么,特别是如果它们都属于同一类型.这对两个以上的成员来说更糟糕,因为嵌套pair非常糟糕.
另一种选择是tuple,无论是来自Boost还是C++ 11,但它看起来并没有更好,更清晰.所以我回去自己编写结构,包括任何需要的比较运算符.
特别是因为这operator<可能非常繁琐,我想通过依赖为tuple以下定义的操作来绕过这整个混乱:

示例operator<,例如严格弱排序:

bool operator<(MyStruct const& lhs, MyStruct const& rhs){
  return std::tie(lhs.one_member, lhs.another, lhs.yet_more) <
         std::tie(rhs.one_member, rhs.another, rhs.yet_more);
}
Run Code Online (Sandbox Code Playgroud)

(从传递的参数中引用tie一个引用.) tupleT&


编辑:从@DeadMG到私有继承的建议tuple并不是很糟糕,但它有一些缺点:

  • 如果运营商是独立的(可能是朋友),我需要公开继承
  • 通过铸造,我的功能/操作员(operator=特别是)可以轻松绕过
  • 有了这个tie解决方案,如果他们对订购无关紧要,我可以省略某些成员

我需要考虑这个实现有什么缺点吗?

c++ tuples operators c++11 strict-weak-ordering

94
推荐指数
2
解决办法
1万
查看次数

std :: tuple成员成员比较失败

我想测试这个非常有趣的答案,并提出了这个最小的实现:

class A
{
    enum M { a };
    std::tuple<int> members;

public:

    A() { std::get<M::a>(members) = 0; }
    A(int value) { std::get<M::a>(members) = value; }
    A(const A & other) { members = other.members; }

    int get() const { return std::get<M::a>(members); }

    bool operator==(A & other) { return members == other.members; }
};
Run Code Online (Sandbox Code Playgroud)

一个简单的测试:

int main() {

    A x(42);
    A y(x);

    std::cout << (x==y) << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

一切都很好,直到我定义一个简单的struct B {};并尝试添加它的一个实例作为成员.我一写

std::tuple<int, B> members;
Run Code Online (Sandbox Code Playgroud)

operator== …

c++ stdtuple

0
推荐指数
1
解决办法
120
查看次数

标签 统计

c++ ×3

operators ×2

c++11 ×1

stdtuple ×1

strict-weak-ordering ×1

tuples ×1