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