【问题标题】:C++ Function pointer of instance objects实例对象的 C++ 函数指针
【发布时间】:2013-03-02 20:31:06
【问题描述】:

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

当valid被调用时,is相当于:

x->getX() == 20;

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

谢谢。

编辑::

确切的编译器错误如下:

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

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

【问题讨论】:

  • “不起作用”是什么意思?
  • 函数指针不是函子。仿函数是一个重载operator()的类。
  • 更改为函数指针。 “不起作用”是指在创建 A 的实例时它无法编译。
  • 粘贴确切的编译器错误。
  • getX 是某个类的方法。 x 是该类的一个对象。您不能将 x.getX 作为指向正常函数的指针传递。它在 C++ 中不起作用,就像 C# 中的委托一样。我能想到的最简单的方法是制作一个包装器,以获得你想要的结果。在 C++ 中必须有一些惯用的方法,但你需要知道该语言的人来告诉你。

标签: c++ function-pointers


【解决方案1】:

如果你可以使用 C++11:

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

此外,如果您想将基本类型(int、float ...)的比较运算符作为参数传递,您可以使用在 functional> 标头中定义的Comparison function objects(std::less,std: :更大...)

#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);
}

【讨论】:

    猜你喜欢
    • 2012-04-26
    • 2010-09-14
    • 2019-10-19
    • 2012-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-29
    • 2013-01-22
    相关资源
    最近更新 更多