(C ++)我有很多Entry类,并且得到了BaseProcessor接口,它包含了Entry处理逻辑。 (见下面的代码)
Entry不提供运算符<()。 BaseProcessor提供指向less(Entry,Entry)函数的指针,该函数特定于特定的BaseProcessor实现。
我可以使用函数指针来比较程序中的Entry实例。但是我需要为Entry类创建std :: set(或std :: map,或其他使用less()的东西)。我曾尝试使用std :: binary_function派生类将其传递给std :: set,但看起来我无法将函数指针值传递给模板。
我该怎么做?是否有可能使用C ++ 03?
感谢。
struct Entry
{
// ...
private:
bool operator< (const Entry &) const; // Should be defined by BaseProcessor.
};
typedef bool (*LessFunc)(const Entry &, const Entry &);
class BaseProcessor
{
public:
// ...
virtual LessFunc getLessFunc () const = 0;
};
// ...
BaseProcessor *processor = getProcessor();
LessFunc lessfunc = processor->getLessFunc();
Entry e1;
Entry e2;
bool isLess = lessfunc(e1, e2); // OK
typedef std::set<Entry, ???> EntrySetImpl; // how to use lessfunc here?
EntrySetImpl entries;
答案 0 :(得分:5)
你试过这个吗?
typedef std::set<Entry, LessFunc> EntrySetImpl;
EntrySetImpl entries(lessfunc);
请注意,您需要将比较函数或对象的类型指定为set
的模板参数,然后为其提供实例实际创建集合时的比较函数或对象。
我会编辑我的答案以解决您的后续问题,因为它更容易一些。
您可以像这样定义模板:
template <LessFunc func> class MyContainer { /*code*/ };
但是,问题是,您必须指定特定的函数,而不是函数指针变量作为模板参数。所以,例如,这没关系:
bool CompareEntries1(const Entry &, const Entry &);
MyContainer<CompareEntries1> container;
......但这不行:
bool CompareEntries1(const Entry &, const Entry &);
LessFunc lessfunc = &CompareEntries1; //or any other way of getting a LessFunc
MyContainer<lessfunc> container;
如果您使用过数组模板类,例如boost::array
,那么您之前可能已经看过类似的内容。您可以编写array<int, 10>
来声明一个10个元素的数组,但是您不能编写array<int, abs(x)>
。数组的大小必须是编译器在编译程序时可以被告知的内容,但在运行之前。 (关于允许的内容有一套非常具体的规则 - 即使看起来编译器应该能够计算出模板参数是什么,比如上面的LessFunc
示例,它仍然必须遵循特定的在函数指针模板参数的情况下,参数必须是函数的名称,或者&
后跟函数的名称。)