因此,我有两个包含 std::map 成员的类,其功能实际上相同,只是一个映射的顺序是 std::less,另一个映射的顺序是 std::greater。
如果我创建一个抽象父类并声明一个映射成员,是否有任何方法可以在派生类构造函数中动态分配该成员的比较器?这样,功能显然可以全部驻留在父类中。
您无法在事后更改比较器。但是您可以使用相同的比较器类,并在构造时获得“更大”或“更少”。你只需要一个有状态的比较器:
struct my_compare {
enum compare_type { less, greater };
explicit my_compare(compare_type t) : m_type(t) {}
template<class T, class U>
bool operator()(const T& t, const U& u) const {
if(m_type == less) { return t < u; }
else { return t > u; }
}
compare_type m_type;
};
然后你可以做
std::map<int, int, my_compare> less_map((my_compare(my_compare::less)));
std::map<int, int, my_compare> greater_map((my_compare(my_compare::greater)));
额外的一对括号是因为否则这将是最令人烦恼的解析,即使函数参数声明不能有限定名称。在 C++11 中,列表初始化 (my_compare{mycompare::less}
) 可以用来代替。
对于您的特定设计,实现可能如下所示
class A {
protected:
explicit A(my_compare::compare_type ct) : my_map(my_compare(ct)) {}
std::map<int, int, my_compare> my_map;
};
class B_less : public A{
public:
B_less() : A(my_compare::less) {}
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)