我有一个简单的模板类,它有两个函数指针和一个值。一个指针是比较运算符,另一个指针是对象(例如getX())。
部首:
template<class T>
class A {
public:
A(T (*function)(), const bool (*op)(T,T),const T value) :
function(function), value(value), op(op){}
bool valid();
private:
T value;
T (*function)();
bool (*op)(T, T);
};
CPP:
#include "A.h"
template<class T>
bool A<T>::valid(){
return (op(function(),value));
}
因此,如果您创建了A:
的实例A<float> a = A<float>(x->getX,operator==,20);
当调用有效时,将等同于:
x->getX() == 20;
实际的标头/类定义工作正常。问题是在创建A的实例时;它不起作用。我认为这是因为'x-&gt; getX',但有没有办法做我想要的?
感谢。
EDIT ::
确切的编译器错误如下:
.... \ Classes \ Objects \ B.cpp:42:错误:没有匹配函数来调用'A :: A(未解析的重载函数类型,未解析的重载函数类型,浮点)' .... \ Classes \ Objects / Ah:30:注意:候选人是:A :: A(T()(),const bool()(T,T),T)[with T =浮动] .... \ Classes \ Objects / A.h:26:注意:A :: A(const A&amp;)
请注意:'x-&gt; getX'返回一个浮动
答案 0 :(得分:0)
如果你可以使用C ++ 11:
实现目标的方法是使用std::bind和std::function。
另外,如果你想作为基本类型(int,float ...)的参数比较运算符传递,你可以使用&lt; functional&gt;中定义的Comparison function objects
。 header(std :: less,std :: greater ...)
#include <functional>
#include <iostream>
template<class T, typename BinaryPredicate>
class A {
public:
A(std::function<T()> function, BinaryPredicate pred,const T value) :
function_(function), pred_(pred), value_(value){}
bool valid();
private:
std::function<T()> function_;
BinaryPredicate pred_;
T value_;
};
template<class T, typename BinaryPredicate>
bool A<T, BinaryPredicate>::valid(){
return (pred_(function_(), value_));
}
class X {
private:
float val_;
public:
X(float val) : val_(val) {}
float getX() {return val_;}
};
int main(void)
{
X x(20);
A<float, std::equal_to<float>> a(std::bind(&X::getX, &x), std::equal_to<float>(), 20);
std::cout << std::boolalpha << a.valid() << std::endl;
return (0);
}