【问题标题】:Trying to get past std::bind compile errors试图通过 std::bind 编译错误
【发布时间】: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... )。然后你必须正确设置参数。

标签: c++ stdbind


【解决方案1】:

再次感谢@PlinyTheElder,但我认为我们“官方”没有回答这个问题。结束循环,这里是函数数组中第一个剪切的声明:

static Get *MakeGArrayStatic(void *Subscript, const char **array, size_t sizeOfArray);
static Get *MakeGStatic(void *field, size_t sizeOfField);
typedef std::tr1::function<Get *()> GetMaker;
static GetMaker gm[];

这是目前为止的数组定义:

std::tr1::function<Get *()> Get::gm[] = { 
    std::tr1::bind(&Get::MakeGArrayStatic, &OutMsg::CurrentSeverity, FacSevTbls::SyslogSeveritiesForMessages, FacSevTbls::NumberOfTrueSeverities), 
    std::tr1::bind(&MakeGStatic, Msg::MessageID, 8) } ;

下面是一个调用函数的简单示例:

    Get *g = Get::gm[0]();

结果比我希望的要好。我曾设想所有“小函数”都必须具有相同的签名(如重载)。在两个目标编译器上都能干净地编译。 (尚未测试执行,但我有信心。)再次感谢!

更新:是的,它执行了。

【讨论】:

    猜你喜欢
    • 2016-11-13
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-01
    • 1970-01-01
    • 2018-10-04
    相关资源
    最近更新 更多