我必須根據std::multiset. 這個想法是,當兩個多重集進入同一個“視圖”時,我的班級需要對它們進行排序,制作運算子和迭代器等,但我基本上停留在第一步。問題是我需要創建相同的類,只是使用不同數量的模板變數。主程式像這樣呼叫我的類,例如:
multisets_merge_view<int> mvi(a, b); //a and b are std::multiset<int>
multisets_merge_view<int, std::greater<int>> mvi(ga, gb); //ga and gb are std::multiset<int, std::greater<int>>
我需要使用 g 編譯器 -fsanitize=address,leak,undefined -O3 -Wall -Wextra -Werror
uj5u.com熱心網友回復:
解決這個問題的一個非常簡單的方法是為比較器提供一個默認引數:
template <typename T, typename C = std::less<T>>
class multisets_merge_view { /* ... */ };
從 C 17 開始,您可以依賴類模板引數推導,這可以大大簡化模板類的使用——您甚至不必提供推導指南:
template <typename T, typename C>
class multisets_merge_view
{
public:
multisets_merge_view (std::multiset<T, C>& x, std::multiset<T, C>& y);
};
// the deduction guide (but not necessary)
template <typename T, typename C>
multisets_merge_view(std::multiset<T, C>& x, std::multiset<T, C>& y)
-> multisets_merge_view <T, C>;
這允許使用您的類,例如:
multisets_merge_view mvi(a, b);
multisets_merge_view mvi_g(ga, gb);
注意:不再需要指定任何模板引數......
另一個變體是讓您的視圖類完全通用:
template <typename T>
class generic_merge_view
{
using Compare = typename T::key_compare;
public:
generic_merge_view(T& x, T& y)
{
// just for demonstration
Compare c;
for(auto ix = x.begin(), iy = y.begin(); /*...*/; ix, iy)
{
if(c(*ix, *iy))
{
// do something
}
}
}
};
您可以從鴨打字利潤:只要型提供的所有模板所需的功能-在這種情況下key_compare的typedef和能力來迭代-您可以使用它,這將包括例如std::set,std::map和std::multimap也。
然后模板型別有所不同(它是集合或映射本身,而不僅僅是集合/映射的模板引數),但是使用 CTAD 您不需要關心......
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/383313.html
