使用函数指针的C ++模板参数

时间:2016-12-19 05:59:04

标签: c++ templates

我的代码如下: 我使用函数指针来创建模板类对象。为什么我这样做是因为我的比较器类Less使用成员函数来显示结果。但是如果我用operator()定义一个类,它将产生一个错误,即内部类不能访问外部类的非静态成员。所以我会使用一个函数来创建模板参数。

#include <iostream>
using namespace std;

template <typename Comp>
class Compare{
private:
    int a[10]{1,2,3,4,5,6,7,8,9,0};
public:
//  class Less{ //use inner class, can't visit the member function in OuterClass like java. so we'd use a function pointer to initialize the template
//      public: 
//          
//  };
    bool Less(int v1, int v2){
        return a[v1] < a[v2];
    }
private:
    Comp comp;
public:
    void compare(int v1, int v2){
        cout << comp(v1, v2);
    }
};

int main()
{
    Compare<&Compare::Less> c;
    c.compare(1, 2);    
}

但是,我收到如下错误:

In function 'int main()':
[Error] template argument 1 is invalid
[Error] invalid type in declaration before ';' token
[Error] request for member 'compare' in 'c', which is of non-class type 'int'

真的想知道原因。 THX:!)

2 个答案:

答案 0 :(得分:0)

使用仿函数执行此操作的简单方法是,您只想重载operator()并将数组作为私有成员放在仿函数中,并将此仿函数创建为main中的实例以调用它:

#include <iostream>
using namespace std;

class Comparator{
private:
    int a[10]{1,2,3,4,5,6,7,8,9,0};
public:
    bool operator()(int v1, int v2) const{
        return a[v1] < a[v2];
    }
};


int main(){
    Comparator less;
    cout<<less(1,2)<<endl;
}

如果你正在为Dijkstra算法编写比较器,你应该定义一个简单的函数指针而不将数组作为私有成员只是重载operator()而不是传入你定义的min_heap中的数组或向量,可以找到类似的方法在std :: priority_queue

    template<class Comparable>
    Comparator<Comparable> comp;
    std::priority_queue<Comparable, vector<Comparable>, Comparator<Comparable>> pq(comp,a);

希望它有所帮助。

答案 1 :(得分:0)

<强>原因:

&Compare::Less

不是类型,而模板需要类型。它的值为bool (Compare::*)(int, int)。您可以安全地使用decltype(&Compare::Less)

<强>设计

设计看起来很脆弱,因此模板的问题可能不是解决的正确问题。

另外,我是@ R.Sahu所说的,试着重新审视基本面。

对于算法实现,我建议您从boost.graph

中汲取灵感