【发布时间】:2018-09-22 22:41:42
【问题描述】:
我以前使用过 std::bind,我认为这种用法很接近,但不完全在那里,我不知道如何解决编译错误。
最终目标是一个中等大小的指向少数函数的指针数组,每个数组元素都有不同的参数。此时我只有一个函数和一个表条目。如果我能做到这一点,我想我可以解决剩下的问题。我想使用 std::function 以便可以将各种参数放入数组中。
到目前为止,这里是一个函数的声明:
static Get *MakeGArrayStatic(void *Subscript, const void **array, unsigned int sizeOfArray);
下面是数组典型的单指针声明:
typedef std::tr1::function<Get *(void *, const void**, unsigned int)> GetMaker;
static GetMaker *gm1;
这是指针的定义:
Get::GetMaker *Get::gm1 = std::tr1::bind(&MakeGArrayStatic, &OutMsg::CurrentSeverity, FacSevTbls::SyslogSeveritiesForMessages, FacSevTbls::NumberOfTrueSeverities);
(Get 是一个类,CurrentSeverity 是一个枚举,SyslogSeveritiesForMessages 是一个 const char **,NumberOfTrueSeverities 是一个 size_t。)
我得到的错误(VS 2010)是
错误 C2440:“正在初始化”:无法从“std::tr1::_Bind<_result_type>”转换为“Get::GetMaker *” 和 [ _Result_type=获取 *, _Ret=得到 *, _BindN=std::tr1::_Bind3,SyslogEnums::SeverityEnum *,const char **,size_t> ] 没有可以执行此转换的用户定义转换运算符,或者无法调用该运算符
谁能指出我哪里出错了?
【问题讨论】:
-
为什么不使用 lambda 函数而不是
std::bind? -
为什么
gm1是一个指针? -
因为我的目标是两个编译器,而另一个很遗憾不支持 lambda 函数。 (VS 2010 也没有,但升级 VS 会很容易。其他编译器不是这样。)但是很好的建议。谢谢。
-
但是
std::bind()不返回指针,是吗?它按值返回一个可调用对象(您可以将其分配给您的std::function())。 -
@Charles:不不,应该是
GetMaker func = std::bind( ...your params here... )。然后你必须正确设置参数。