我的程序说明了可用作STL容器实例化的排序谓词的谓词模板:
#include <iostream>
#include <set>
#include <iterator>
#include <algorithm>
#include <functional>
#include <string>
using namespace std;
template<typename T, template <typename> class comp = std::less> struct ComparePtr: public binary_function<T const *, T const *, bool> {
bool operator()(T const *lhs, T const *rhs) const {
comp<T> cmp;
return (cmp(*lhs, *rhs));
}
};
int wmain() {
string sa[] = {"Programmer", "Tester", "Manager", "Customer"};
set<string *, ComparePtr<string>> ssp;
for (int i(0) ; i < sizeof sa/sizeof sa[0] ; ++i)
ssp.insert(sa + i);
for_each(ssp.begin(), ssp.end(), [](string *s){ cout << s->c_str() << endl; });
return 0;
}
请关注谓词:它写得正确吗?
实例化comp
是否合适?有没有一种方法可以不实例化comp
谓词?
答案 0 :(得分:3)
为什么要使用模板模板而不只是在一般二进制比较器周围添加一个简单的包装器?
template<typename P>
struct PointerPred {
P p;
template<typename T>
bool operator()(const T& x, const T& y) { return p(*x, *y); }
};
Boost Pointer Containers也可以让这更容易。
Ildjarn展示了如何正确实现您的仿函数:
template<template<typename> class comp = std::less>
struct ComparePtr {
template<typename T>
bool operator()(T const *lhs, T const *rhs) const {
return comp<T>()(*lhs, *rhs);
}
};
这样就没有必要再指定参数的类型了。
编辑:我的代码中曾经有std::forward
和rvalue引用,这完全没有意义。