模板结构中的重载运算符

时间:2014-08-30 11:45:53

标签: c++ templates operator-overloading

我有以下场景:我有一个结构template<typename CType, int D> struct Point,其中我想重载运算符&lt;和&gt;。接下来是我不确定的问题:我想要&lt;的不同实现。和&gt;取决于CType是浮点数/双精度还是整数。现在我正在使用typeinfo中的typid来做这件事,但我觉得这不优雅。我该如何以干净的方式做到这一点?

2 个答案:

答案 0 :(得分:2)

这是一个选项(使用非成员运算符):

template<typename CType, int D>
bool operator<( Point<CType, D> const &p1, Point<CType, D> const &p2)
{
    // generic logic
} 

template<int D> bool operator<( Point<float, D> const &p1, Point<float, D> const &p2 )
{
    // logic for float
} 

有可能用float替换enable_if以生成适用于所有类型特定类型特征的版本(例如,对所有浮点类型都有一个特化)。

答案 1 :(得分:1)

Live demo link.

#include <iostream>
#include <type_traits>

template <typename CType, int D>
struct Point
{
    template <typename T = CType>
    auto operator<(int t) -> typename std::enable_if<std::is_same<T, int>::value, bool>::type
    {
        std::cout << "int" << std::endl;
        return true;
    }

    template <typename T = CType>
    auto operator<(float t) -> typename std::enable_if<std::is_same<T, float>::value, bool>::type
    {
        std::cout << "float" << std::endl;
        return true;
    }
};

int main()
{
    Point<int, 1> pi;
    Point<float, 1> pf;
    pi < 5;
    pf < 3.14f;
    pi < 3.14f; // forced to apply operator<(int) 
}