Return Class 函数指针 c++
Return Class function pointer c++
为了解释我的项目,我试图让一个容器包含从基础 class 派生的计划对象。重点是启动具有特定功能的未指定数量的对象,并将它们 运行 按一定顺序排列。为此,我需要从对象中获取此特定功能。
所以...我在处理函数指针和多态性时遇到问题。我想从 class 方法 return 我的 Class 的函数指针。
我有以下基础class:
#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
我有这个派生 class:
#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)));
}
};
如您所见,我正在尝试 return 功能区。我尝试在没有 std::function 和 std::bind 的情况下执行此操作,但无法设法 return 函数指针。
现在我在使用 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);
bind 似乎没有正确数量的参数,我不明白为什么,我也不明白第二个错误。
谁能帮我解决我的问题?
谢谢
我认为您需要占位符来表示未来的参数(即 return_function
的参数)
using namespace std::placeholders; // for _1, _2, _3...
std::bind(&Triangle::area, this, _1, _2);
您可以使用 lambda 表达式代替绑定
替换
std::bind(&Triangle::area, this);
来自
[this](void* in, void *out){return area(in, out);};
为了解释我的项目,我试图让一个容器包含从基础 class 派生的计划对象。重点是启动具有特定功能的未指定数量的对象,并将它们 运行 按一定顺序排列。为此,我需要从对象中获取此特定功能。
所以...我在处理函数指针和多态性时遇到问题。我想从 class 方法 return 我的 Class 的函数指针。
我有以下基础class:
#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
我有这个派生 class:
#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)));
}
};
如您所见,我正在尝试 return 功能区。我尝试在没有 std::function 和 std::bind 的情况下执行此操作,但无法设法 return 函数指针。
现在我在使用 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);
bind 似乎没有正确数量的参数,我不明白为什么,我也不明白第二个错误。
谁能帮我解决我的问题?
谢谢
我认为您需要占位符来表示未来的参数(即 return_function
的参数)
using namespace std::placeholders; // for _1, _2, _3...
std::bind(&Triangle::area, this, _1, _2);
您可以使用 lambda 表达式代替绑定
替换
std::bind(&Triangle::area, this);
来自
[this](void* in, void *out){return area(in, out);};