C++:继承v.对一个模板化类的包含

Nic*_*ner 0 c++ templates coding-style specialization

我有以下结构:

template <typename T>
struct Odp
{
    T m_t;
};
Run Code Online (Sandbox Code Playgroud)

我想专门化它,所以我可以添加一个运算符,以便类型与STL集很好地匹配.(我无法Odp直接修改;它是遗留代码.)以下是我看到的两种方法:

struct Ftw : public Odp<int>
{
    bool operator==(const Ftw& rhs)
    {
        return m_t == rhs.m_t;
    } 
};

struct FtwContain
{
    Odp<int> odp;
    bool operator==(const FtwContain& rhs)
    {
        return odp.m_t == rhs.odp.m_t;
    }
};
Run Code Online (Sandbox Code Playgroud)

有没有理由比第一个更喜欢第二个?第一种方法似乎允许更清晰的代码:

Ftw ftw;
ftw.m_t = 2;

FtwContain ftwContain;
ftwContain.odp.m_t = 2;
Run Code Online (Sandbox Code Playgroud)

(另外,我很可能对"模板专业化"这个术语的含义感到困惑.)

小智 7

我不相信有任何需要创建一个新类型 - 只需编写一个自由函数:

template <typename T>
bool operator==( const Odp<T> & a, const Odp <T> & b ) {
    return a.m_t == b.m_t;
}
Run Code Online (Sandbox Code Playgroud)