在类中使用的涉及通用比较函数的模板

时间:2015-02-18 20:35:35

标签: c++ templates

我正在尝试在模板中编写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;
};

2 个答案:

答案 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


对于函数对象,这是一个成功编译的例子:

http://ideone.com/yvWD5o

对于不成功的编译:

http://ideone.com/yjeAWB