我们可以有一个不是基于类型而是基于操作的模板吗?

Can we have a template not on type but on operation

本文关键字:操作 于操作 于类型 有一个 我们 类型      更新时间:2023-10-16

我是c++新手。我目前有两个类具有完全相同的代码,只是在某些时候一个类使用'<'操作符,而其他类使用'>'。

是否有办法合并这些类,并在"操作符"上声明模板?

首先,如果您的问题确实限于<>,那么您可以创建一个基类,接受布尔值声明是否使用其中一个。

class base
{
protected:
    base(bool use_less) : m_use_less{less}
    some_return_type my_fn(some_args args)
    {
         ...
         const bool cmp = m_use_less? a < b: a > b;
         ...
    }
private:
    const bool m_use_less;
}

const bool cmp = m_use_less? a < b: a > b;

在你的代码中重复太多次,你可以考虑用一个内联方法来做这件事。


如果你愿意,你可以进一步推广比较,因为许多标准库算法(例如,std::sort)正是这样做的。

通常,标准库算法按如下方式解决它(以下假设您对整数进行操作):

#include <functional>
// Pass the comparison as a template argument
template<class Compare=std::less<int>>
class my_class
{
 private:
    // A comparison object
    Compare m_cmp;
 public:
    some_return_type my_fn(some_args args)
    {
        ...
        const bool is_less = m_cmp(lhs, rhs);    
        ...
    }
};

默认情况下,该类使用<(通过std::less)。如果您想使用>,只需使用std::greater实例化。