0

我有一个简单的模板类,它有两个函数指针和一个值。一个指针是比较运算符,另一个是对象(例如 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);
};

共产党:

#include "A.h"

template<class T>
bool A<T>::valid(){
    return (op(function(),value));
}

因此,如果您创建了 A 的实例:

A<float> a = A<float>(x->getX,operator==,20);

当 valid 被调用时,将等同于:

x->getX() == 20;

实际的标头/类定义工作正常。问题是在创建 A 的实例时;它不起作用。我认为这是因为 'x->getX' 但有没有办法做我想做的事?

谢谢。

编辑::

确切的编译器错误如下:

....\Classes\Objects\B.cpp:42: 错误:没有匹配函数调用'A::A(未解析的重载函数类型,未解析的重载函数类型,float)' ....\Classes\Objects /Ah:30: 注意:候选人是:A::A(T ( )(), const bool ( )(T, T), T) [with T = float] ....\Classes\Objects/Ah: 26:注意:A::A(const A&)

请注意:'x->getX' 返回一个浮点数

4

1 回答 1

0

如果可以使用 C++11:

做你想做的事情的方法是使用std::bindstd::function

此外,如果您想将基本类型(int、float ...)的比较运算符作为参数传递,您可以使用Comparison function objects< functional > 标头中定义的(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);
}
于 2013-03-03T04:42:04.510 回答