Barton-Nackman技巧中使用的C ++非模板成员是什么?

时间:2009-05-19 14:25:52

标签: c++ design-patterns templates

来自维基百科:

// A class template to express an equality comparison interface.
template<typename T> class equal_comparable
{
    friend bool operator==(T const &a, T const &b) { return  a.equal_to(b); }
    friend bool operator!=(T const &a, T const &b) { return !a.equal_to(b); }
};

class value_type
// Class value_type wants to have == and !=, so it derives from
// equal_comparable with itself as argument (which is the CRTP).
     : private equal_comparable<value_type>
{
public:
    bool equal_to(value_type const& rhs) const; // to be defined
};

这应该是Barton-Nackman,它可以实现编译时的维度分析(检查应用于变量的某些操作是否以可比较的数字结束,例如速度与空间/时间相当但没有加速度)。 / p>

任何人都可以解释我如何,或者至少向我解释一下非模板成员是什么?

由于

3 个答案:

答案 0 :(得分:4)

自从模式发明以来,语言规则发生了变化,尽管我们注意不要破坏它。换句话说,就我所知,它仍然有效,但原因不同于原来的原因。我认为我不会尝试对这种模式进行维度分析,因为我认为今天有更好的方法可以做到这一点。

我也认为这个例子太过微不足道了。如前所述,equal_comparable<value_type>的实例化会导致出现operator== operator!=value_type equal_comparable。由于它们是非成员,因此继承是私有的并不重要,它们在解析呼叫时仍然可以选择。在这个例子中很难看出这一点。但是,假设您将模板参数添加到template<typename U, typename V> class equal_comparable { friend bool operator==(U const &a, V const &b) { return a.equal_to(b); } friend bool operator!=(U const &a, V const &b) { return !a.equal_to(b); } }; class some_other_type { bool equal_to(value_type const& rhs) const; }; class value_type : private equal_comparable<value_type>, // value_type comparable to itself private equal_comparable<some_other_type> // value_type comparable to some_other_type { public: bool equal_to(value_type const& rhs) const; bool equal_to(some_other_type const& rhs) const; }; 以及其他一些内容:

{{1}}

免责声明:我不知道这是否是所谓的使用方式,但我有理由相信它会按照描述的方式运作。

答案 1 :(得分:1)

这些实际上是非模板非成员 - 基本模板中的比较运算符 - 它们被ADL用于派生类。模板成员可能是:


class C
{
    ...
    template < typename T > void DoGreatStuff( T t ) { ... }
    ...
};

答案 2 :(得分:1)

equal_comparable<value_type>类中value_type的实例化会导致编译器生成两个比较函数:

friend bool operator==(value_type const &a, value_type const &b) { return  a.equal_to(b); }
friend bool operator!=(value_type const &a, value_type const &b) { return !a.equal_to(b); }

这些函数是非模板的,因为它们不依赖于任何模板参数,但它们也是非成员,因为它们被声明为friend