【问题标题】:Barton-Nackman vs std::enable_if巴顿-纳克曼 vs std::enable_if
【发布时间】:2012-12-04 14:27:43
【问题描述】:

什么是可取的(如果有的话)?

变体 A(巴顿-纳克曼):

template<class T>
struct equal_comparable {
    friend bool operator == (const T & t1, const T & t2) {
        return t1.equalTo (t2);
    }
};

class MyClass : private equal_comparable<MyClass> {
    bool equalTo (const MyClass & other)  //...
};

变体 B (std::enable_if):

struct MyClass {
    static const bool use_my_equal = true;
    bool equalTo (const MyClass & other) //...
};

template<class T>
typename std::enable_if<
    T::use_my_equal,
    bool
>::type
operator == (const T & t1, const T & t2) { return t1.equalTo (t2); }

【问题讨论】:

  • 我个人更喜欢前者。 equal_comparable 可以放入合适的命名空间,但谁知道成员 use_my_equal 被某种类型的 T 用于你从未听说过的。当然,这个问题适用于 enable_if 的其他类似用途——仅仅因为解析依赖名称并不必然意味着该名称用于您认为的含义,如果您正在提取它在您无法控制的命名空间之外。您可以改用类型特征。
  • 为什么要使用模板?为什么不只是bool operator==(const MyClass&amp;, /* etc */);?
  • @GManNickG:我相信这个技巧的目的是减少每个类所需的样板文件,这是平等可比的。
  • @SteveJessop:哦,对了。从来不是粉丝。 :)
  • @GManNickG:Boost 运算符更有说服力,因为运算符重载中的实际信息需要重用。它们不纯粹是为了将每个运算符转发给一个相应的成员函数。

标签: c++ operator-overloading template-meta-programming c++-concepts


【解决方案1】:

我更喜欢使用 @SteveJessop 在 cmets 中提到的 Boost.Operators,它将您的第一种方法形式化和自动化。如果您碰巧需要多组运算符(因此需要多重继承),它们还会处理空基优化。与其说是节省了打字,还不如说是代码文档/执行价值,因为这些基类就在类接口的前面。从这个意义上说,它是概念的一种原始方式。

【讨论】:

    猜你喜欢
    • 2018-09-28
    • 1970-01-01
    • 2012-06-18
    • 1970-01-01
    • 1970-01-01
    • 2018-02-15
    • 2012-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多