C++ 返回类函数指针c++;

C++ 返回类函数指针c++;,c++,function,polymorphism,function-pointers,C++,Function,Polymorphism,Function Pointers,为了解释我的项目,我尝试用一个容器来表示从基类派生的schedule对象。关键是使用特定函数启动数量不确定的对象,并按特定顺序运行它们。要做到这一点,我需要从对象中获取这个特定函数 所以。。。我在操作函数指针和多态性时遇到问题。我想从类方法返回类的函数指针 我有以下基类: #ifndef PLUGIN_POLYGON_BASE_H_ #define PLUGIN_POLYGON_BASE_H_ #include <iostream> #include <functional&

为了解释我的项目,我尝试用一个容器来表示从基类派生的schedule对象。关键是使用特定函数启动数量不确定的对象,并按特定顺序运行它们。要做到这一点,我需要从对象中获取这个特定函数

所以。。。我在操作函数指针和多态性时遇到问题。我想从类方法返回类的函数指针

我有以下基类:

#ifndef PLUGIN_POLYGON_BASE_H_
#define PLUGIN_POLYGON_BASE_H_

#include <iostream>
#include <functional>

typedef std::function<int(void*,void*)> return_function;


namespace polygon_base
{
  class RegularPolygon
  {
    public:
      virtual int area(void* in, void* out) = 0;
      virtual return_function getFunction(void) = 0;
      virtual ~RegularPolygon(){}


    protected:
      RegularPolygon(){}
  };  
};
#endif
#ifndef插件(多边形)基础(H)_
#定义插件\u多边形\u基础\u H_
#包括
#包括
typedef std::函数返回函数;
名称空间多边形库
{
类正则多边形
{
公众:
虚拟整数区域(空*进,空*出)=0;
虚拟返回函数getFunction(void)=0;
虚~RegularPolygon(){}
受保护的:
正则多边形(){}
};  
};
#恩迪夫
我有一个派生类:

#include "polygon_base.h"
#include <cmath>

namespace polygon_plugin
{
  class Triangle : public polygon_base::RegularPolygon
  {
    public:
      Triangle(){}

      int area(void* in, void* out)
      {
        double* in_temp = (double*)in;
        double* out_temp = (double *)out;
        *out_temp = 0.5 *  *in_temp * getHeight(*in_temp);
        return 0;
      }

      return_function getFunction()
      {
        return std::bind(&Triangle::area, this);
      }

    private:
      double getHeight(double side_length_)
      {
        return sqrt((side_length_ * side_length_) - ((side_length_ / 2) * (side_length_ / 2)));
      }
    };
#包括“polygon_base.h”
#包括
名称空间多边形插件
{
类三角形:公共多边形_基::正则多边形
{
公众:
三角形(){}
内部区域(空*进,空*出)
{
双*英寸温度=(双*)英寸;
双*输出温度=(双*)输出;
*输出温度=0.5**输入温度*获取高度(*输入温度);
返回0;
}
返回函数getFunction()
{
返回std::bind(&Triangle::area,this);
}
私人:
双倍高度(双面长度)
{
返回sqrt((边长×边长)-((边长×边长)×边长×边长);
}
};
如您所见,我正在尝试返回函数区域。我尝试在没有std::函数和std::bind的情况下返回函数区域,但无法返回函数指针

现在我使用G++用C++ 11标准编写了这个编译程序错误。
/usr/include/c++/5/functional: In instantiation of ‘struct std::_Bind_check_arity<int (polygon_plugin::Triangle::*)(void*, void*), polygon_plugin::Triangle*>’:
/usr/include/c++/5/functional:1439:12:   required from ‘struct std::_Bind_helper<false, int (polygon_plugin::Triangle::*)(void*, void*), polygon_plugin::Triangle*>’
/usr/include/c++/5/functional:1462:5:   required by substitution of ‘template<class _Func, class ... _BoundArgs> typename std::_Bind_helper<std::__is_socketlike<_Func>::value, _Func, _BoundArgs ...>::type std::bind(_Func&&, _BoundArgs&& ...) [with _Func = int (polygon_plugin::Triangle::*)(void*, void*); _BoundArgs = {polygon_plugin::Triangle*}]’
polygon_plugin.h:27:47:   required from here
/usr/include/c++/5/functional:1426:7: error: static assertion failed: Wrong number of arguments for pointer-to-member
       static_assert(_Varargs::value
       ^
polygon_plugin.h: In member function ‘virtual return_function polygon_plugin::Triangle::getFunction()’:
polygon_plugin.h:27:25: error: could not convert ‘std::bind(_Func&&, _BoundArgs&& ...) [with _Func = int (polygon_plugin::Triangle::*)(void*, void*); _BoundArgs = {polygon_plugin::Triangle*}; typename std::_Bind_helper<std::__is_socketlike<_Func>::value, _Func, _BoundArgs ...>::type = std::_Bind<std::_Mem_fn<int (polygon_plugin::Triangle::*)(void*, void*)>(polygon_plugin::Triangle*)>](((polygon_plugin::Triangle*)this))’ from ‘std::_Bind_helper<false, int (polygon_plugin::Triangle::*)(void*, void*), polygon_plugin::Triangle*>::type {aka std::_Bind<std::_Mem_fn<int (polygon_plugin::Triangle::*)(void*, void*)>(polygon_plugin::Triangle*)>}’ to ‘return_function {aka std::function<int(void*, void*)>}’
         return std::bind(&Triangle::area, this);
/usr/include/c++/5/functional:在“struct std::\u Bind\u check\u arity”的实例化中:
/usr/include/c++/5/functional:1439:12:在“struct std:_Bind_helper”中为必填项
/usr/include/c++/5/functional:1462:5:替换“模板类型名称std::_Bind_helper::type std::Bind(_Func&,_BoundArgs&&&…[带_Func=int(polygon_plugin::Triangle::*)(void*,void*);_BoundArgs={polygon_plugin::Triangle*}所需
polygon_plugin.h:27:47:此处为必填项
/usr/include/c++/5/functional:1426:7:错误:静态断言失败:指向成员的指针的参数数目错误
静态断言(_Varargs::value)
^
polygon_plugin.h:在成员函数“virtual return_function polygon_plugin::Triangle::getFunction()”中:
polygon_plugin.h:27:25:错误:无法将“std::bind(_Func&&,_BoundArgs&&…[与_Func=int(polygon_plugin::Triangle::*)(void*,void*);_BoundArgs={polygon_plugin::Triangle*);typename std::_bind_helper::type=std:((polygon_plugin::Triangle*)this*)”从“std:(绑定(helper::type{aka std:)转换为}”'到'return_function{aka std::function}'
返回std::bind(&Triangle::area,this);
bind似乎没有正确的参数数量,我不知道为什么,我也不理解第二个错误

有人能帮我解决我的问题吗


谢谢

我认为您需要为将来的参数(即
返回函数的参数
)设置占位符


可以使用lambda表达式而不是bind

通过替换

std::bind(&Triangle::area, this);


哦,thx!我试过std::bind(&Triangle::area,this,std::placeholders::_2);认为这意味着area有两个参数…不知道我必须使用std::bind(&Triangle::area,this,std::placeholders::_1,std::placeholders::_2)@MatthieuAmy为每个参数设置一个占位符更灵活。例如,如果您的
in
out
参数在
return\u函数中交换,您将编写
std::bind(&Triangle::area,this,_2,_1);
Thx,这看起来更简单、更优雅。我也会尝试一下
std::bind(&Triangle::area, this);
[this](void* in, void *out){return area(in, out);};