【问题标题】:Different amount of template variables不同数量的模板变量
【发布时间】:2022-01-19 10:29:29
【问题描述】:

我必须根据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>>

我需要使用带有-fsanitize=address,leak,undefined -O3 -Wall -Wextra -Werror的g++编译器

【问题讨论】:

  • 如果仅用于比较器,为什么不提供默认值? template&lt;typename T, typename C = std::less&lt;T&gt;&gt; 注意:std::multiset 实际上也是如此。

标签: c++ templates stl multiset


【解决方案1】:

解决这个问题的一个非常简单的方法是为比较器提供一个默认参数:

template <typename T, typename C = std::less<T>>
class multisets_merge_view { /* ... */ };

从 C++17 开始,您可以依赖 class template argument deduction,它可以大大简化模板类的使用——您甚至不必提供以下推导指南:

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::setstd::mapstd::multimap 也是如此。

然后,模板类型会有所不同(它是集合或映射本身,而不仅仅是集合/映射的模板参数),但使用 CTAD,您无需关心...

【讨论】:

  • “你必须提供一个扣除指南,但是” 为什么?默认一个看起来不错Demo
  • 非常感谢,前提是默认参数有效!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-16
  • 1970-01-01
  • 1970-01-01
  • 2012-04-28
相关资源
最近更新 更多