我正在尝试在模板中编写Bheap,并且插入函数涉及通用比较函数。通常的方法是什么?我知道如何在C中使用函数指针。但是有没有任何典型的C ++方法呢?
有人告诉第一个,哪个F级可以代表任何功能。但我希望这个函数是一个像f(T,T)这样的比较函数。虽然第二个人谈论了仿函数
template <class T, class F>class Bheap
{
public:
Bheap<T>(int allocateSize);
void insert(T value, F f);
void getMax();
private:
int sizeUsed;
int allocateSize;
vector<T> myBheap;
};
答案 0 :(得分:0)
仿函数是一个提供一个或多个operator()重载的结构,如果你有几个比较,它就是一个选择:
// Having a struct X { K key, V value };
struct Less {
template <typename K, typename V>
operator bool () (const X<K, V>& a, const X<K, V>& b> const {
return a.key < b.key;
}
template <typename K, typename V>
operator bool () (const X<K, V>& a, const K& b> const {
return a.key < b;
}
template <typename K, typename V>
operator bool () (const K& a, const X<K, V>& b> const {
return a < b.key;
}
};
答案 1 :(得分:0)
您应该实现您的类和insert
函数,假设传递的任何内容在参数数量方面是正确的。如果参数的数量不是2,编译器会通知你。
这是在这些情况下的预期效果。让编译器检测到该函数无效,因此用户必须将函数更改为正确的要求。
使用您的代码进行演示将是:
#include <vector>
template <class T, class F>
class Bheap
{
public:
Bheap(int allocateSize) {}
void insert(T value, F f)
{
f(value, value);
}
void getMax();
private:
int sizeUsed;
int allocateSize;
std::vector<T> myBheap;
};
void SomeFunction(int, int)
{}
int main()
{
typedef void (*fn)(int, int);
Bheap<int, fn> b(10);
b.insert(10, SomeFunction);
}
你会看到这个编译和链接正确(我使用了一个函数指针,但是一个带有重载operator()
的仿函数也足够了。)
现在,如果将用户的功能更改为接受1个参数的功能,那么我们会得到一个不同的场景:
#include <vector>
template <class T, class F>
class Bheap
{
public:
Bheap(int allocateSize) {}
void insert(T value, F f)
{
f(value, value);
}
void getMax();
private:
int sizeUsed;
int allocateSize;
std::vector<T> myBheap;
};
void SomeFunction(int)
{}
int main()
{
typedef void (*fn)(int);
Bheap<int, fn> b(10);
b.insert(10, SomeFunction);
}
无效函数会使您的类无法编译。由于您的模板需要2参数函数,通过指针传递1参数函数会导致错误(您可以在此处看到:http://ideone.com/rT7RRa)
对于函数对象,这是一个成功编译的例子:
对于不成功的编译: