我有以下情形:我有一個結構template<typename CType, int D> struct Point
,其中我想重載運算符<和>。這裏出現的問題和我不確定的觀點:我需要<和>的不同實現,具體取決於CType是float/double還是int。現在我正在使用typeinfo中的typid來做這件事,但我覺得這樣不夠高雅。我如何以乾淨的方式去做這件事?模板中的重載運算符結構
1
A
回答
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
}
可能可以與enable_if
更換float
做,對於所有類型的某種類型特徵的工作的版本(例如已針對所有浮點類型的單一專業化)。
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)
}
相關問題
- 1. 重載結構運算符
- 2. 運算符重載在結構
- 3. C++運算符重載類和結構
- 4. 運算符重載指針結構
- 5. C++模板類運算符重載
- 6. 模板和運算符重載
- 7. C++模板和運算符重載
- 8. 運算符使用模板重載
- 9. 模板化運算符()重載C++
- 10. C++運算符重載模板類
- 11. 爲模板重載運算符[] Polynom類
- 12. 重載模板類二元運算符*
- 13. 重載模板關係運算符
- 14. 重載運算符[]爲模板類C++
- 15. C++運算符重載=模板
- 16. 運算符重載VS模板函數
- 17. 運算符重載和模板特化
- 18. 模板運算符重載錯誤
- 19. 結構運算符超載
- 20. 模板基類的模板運算符重載
- 21. 從模板類繼承運算符重載。曖昧過載「運算符*」
- 22. 重載拷貝賦值運算符用於非類型模板結構的成員結構
- 23. 模板運算符模糊過載
- 24. C++中大型複雜結構的比較(運算符重載)
- 25. 在類內的結構中使用運算符重載
- 26. 在模板中重載運算符「=」的問題
- 27. 模板運算符重載中的類型衝突
- 28. 運算符使用BST中的模板進行重載
- 29. 重載模板類數組中的乘法運算符
- 30. 模板類中的關係運算符重載(C++)