当前位置:  开发笔记 > 编程语言 > 正文

关系运算符实现困境

如何解决《关系运算符实现困境》经验,为你挑选了1个好方法。

我在设计几类需要支持运营商的过程中!=,>,<=,和>=.这些运营商将在运营商==和运营商方面实施<.

在这个阶段,我需要在继承std::rel_ops¹ 和迫使消费者使用²"手动" 之间做出选择.

[1]继承(可能的实现):

template class RelationalOperatorsImpl
{
    protected:
    RelationalOperatorsImpl() {}
    ~RelationalOperatorsImpl() {}

    friend bool operator!=(const T& lhs, const T& rhs) {return !(lhs == rhs);}
    friend bool operator>(const T& lhs, const T& rhs) {return (rhs < lhs);}
    friend bool operator<=(const T& lhs, const T& rhs) {return !(rhs < lhs);}
    friend bool operator>=(const T& lhs, const T& rhs) {return !(lhs < rhs);}
};

template class Foo : RelationalOperatorsImpl< Foo >
{
    public:
    explicit Foo(const T& value) : m_Value(value) {}

    friend bool operator==(const Foo& lhs, const Foo& rhs) {return (lhs.m_Value == rhs.m_Value);}
    friend bool operator<(const Foo& lhs, const Foo& rhs) {return (lhs.m_Value < rhs.m_Value);}

    private:
    T m_Value;
};

[2] std::rel_ops胶水:

template class Foo
{
    public:
    explicit Foo(const T& value) : m_Value(value) {}

    friend bool operator==(const Foo& lhs, const Foo& rhs) {return (lhs.m_Value == rhs.m_Value);}
    friend bool operator<(const Foo& lhs, const Foo& rhs) {return (lhs.m_Value < rhs.m_Value);}

    private:
    T m_Value;
};

void Consumer()
{
    using namespace std::rel_ops;

    //Operators !=, >, >=, and <= will be instantiated for Foo (in this case) on demand.
}

我基本上试图避免代码重复.关于哪种方法"感觉"更好的任何想法?



1> Juliano..:

您是否考虑过使用boost,并让您的类继承boost::less_than_comparable并且boost::equality_comparable?它类似于你的第一个建议,有一些优点和缺点.优点:避免代码重复; 缺点:创建对boost的依赖.

由于boost是一个非常常见的C++库(如果你还没有使用它,你应该认真考虑开始使用它),con因子是暗淡的.

推荐阅读
郑谊099_448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有