c++ - 用于 double 和单精度类型的通用对称对 C++

标签 c++ std-pair

我正在尝试拥有一个可以处理对称对的模板结构。实现比较运算符以使结构在 std::map 中工作。

到目前为止,我正在使用以下代码:

template<typename T, typename U>
struct SymmetricPair
{
    SymmetricPair() : m_id(std::pair<T,U>()) {}
    SymmetricPair(const SymmetricPair<T,U>& id) : m_id(id) {}
    SymmetricPair(const SymmetricPair<U,T>& id) : SymmetricPair(id.m_id) {}
    SymmetricPair(const std::pair<T,U>& id) : m_id(id) {}
    SymmetricPair(const std::pair<U,T>& id) : m_id(std::pair<T,U>(id.second,id.first)) {}
    SymmetricPair(const T id_t, const U id_u) : m_id(std::pair<T,U>(id_t, id_u)) {}
    SymmetricPair(const U id_u, const T id_t) : m_id(std::pair<T,U>(id_t, id_u)) {

    bool operator< (const SymmetricPair<T,U>& rhs) const { return m_id <  rhs.m_id; }
    bool operator!=(const SymmetricPair<T,U>& rhs) const { return m_id != rhs.m_id; }
    bool operator==(const SymmetricPair<T,U>& rhs) const { return m_id == rhs.m_id; }
    bool operator< (const SymmetricPair<U,T>& rhs) const { return m_id <  SymmetricPair<T,U>(rhs.m_id).m_id; }
    bool operator!=(const SymmetricPair<U,T>& rhs) const { return m_id != SymmetricPair<T,U>(rhs.m_id).m_id; }
    bool operator==(const SymmetricPair<U,T>& rhs) const { return m_id == SymmetricPair<T,U>(rhs.m_id).m_id; }

    std::pair<T,U> m_id;
};

使用 SymmetricPair<std::string,int> pair(std::pair<int,std::string>(42,"bde"));例如工作正常。

但是,当模板参数 T 时,我遇到了麻烦(编译时错误)和 U是相同的,例如SymmetricPair<std::string,std::string>因为一些操作被认为已经定义

'SymmetricPair<T,U>::SymmetricPair(const SymmetricPair<T,U> &)' : member function already defined or declared   
'SymmetricPair<T,U>::SymmetricPair(const std::pair<_Ty1,_Ty2> &)' : member function already defined or declared 
'SymmetricPair<T,U>::SymmetricPair(const T,const U)' : member function already defined or declared
'bool SymmetricPair<T,U>::operator <(const SymmetricPair<T,U> &) const' : member function already defined or declared   
 'bool SymmetricPair<T,U>::operator !=(const SymmetricPair<T,U> &) const' : member function already defined or declared 
'bool SymmetricPair<T,U>::operator ==(const SymmetricPair<T,U> &) const' : member function already defined or declared  

我该如何解决?我使用的是 VC++ 2005(所以没有 C++11)。

如果还有一种方法可以使结构更优雅,我很感兴趣。

最佳答案

我认为最简单的方法是部分特化,尤其是在 C++11 不可用的情况下:

template<typename T>
struct SymmetricPair<T, T>
{
    SymmetricPair() : m_id() {}
    SymmetricPair(const SymmetricPair& id) : m_id(id.m_id) {}
    SymmetricPair(const std::pair<T,T>& id) : m_id(id) {}
    SymmetricPair(const T id_t, const T id_u) : m_id(id_t, id_u) {}

    bool operator< (const SymmetricPair<T,T>& rhs) const { return m_id <  rhs.m_id; }
    bool operator!=(const SymmetricPair<T,T>& rhs) const { return m_id != rhs.m_id; }
    bool operator==(const SymmetricPair<T,T>& rhs) const { return m_id == rhs.m_id; }

    std::pair<T,T> m_id;
};

关于c++ - 用于 double 和单精度类型的通用对称对 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30348408/

相关文章:

c++ - 将作为字符串输入给出的数字转换为 32 位小端值

c++ - 是否有任何任务栏API可以立即应用注册表更改?

c++ - 关于单例

c++ - 为什么没有验证 "friend class"是否存在?

c++11 - 试图将 const 作为非常量传递的 map 上的 remove_if - 为什么?

c++ - 在 OpenCV 中使用轮廓?

c++ - 是否可以直接从队列成员函数访问一对成员变量?

c++ - 为什么 std::equal_to 会导致动态分配?

c++ - 在一行中初始化一对 vector

c++ - 将 std::pair 作为参数传递时发生奇怪的内存泄漏