在可变参数模板中使用std :: placeholders

sazr

我在使用std::placeholders带有可变模板的函数时遇到困难我开始认为我不需要使用可变参数模板,但是我已经尝试了很长时间了,所以我一直在考虑杂草,并需要一个外观焕然一新的人。

下面的模板化函数接受一个常规的模板化参数,然后接受一个可变参数。这导致了编译器错误:

registerEvent<UpdaterComponent, std::_Ph<1>>(EVT_INIT, &UpdaterComponent::initialise, std::placeholders::_1); 

编译器错误:

错误1错误C2664:'状态组件:: registerEvent>(const int&,状态更新器组件:: *(__cdecl )(const EventArgs&),std :: _ Ph <1>)':无法从'状态(__thiscall)转换参数2 UpdaterComponent ::)(const EventArgs&)'到'Status UpdaterComponent :: *(__cdecl *)(const EventArgs&)'

究竟是哪里出了问题,如何解决此编译器错误?

// In class Component
template<typename T, typename... Params>
Status registerEvent(int evtId, Status T::*func(const EventArgs& evtArgs), Params...)
{
    ... irrelevant code removed for brevity

    auto res = std::bind(func, this, Params...);

    ... irrelevant code removed for brevity
}


// Usage
class UpdaterComponent : public Component
{
public:
    UpdaterComponent()
    {
        registerEvent<UpdaterComponent, std::_Ph<1>>(EVT_INIT, &UpdaterComponent::initialise, std::placeholders::_1);
    }
};
巴里

主要问题是您缺少括号:

template<typename T, typename... Params>
Status registerEvent(int evtId, Status (T::*func)(const EventArgs& evtArgs), Params...)
                                      ^^^       ^^^

因此,您最终会func弄错类型

解决此问题后,为什么要明确提供所有模板参数?这就是模板推导的目的!当您发现自己在打字时std::_Ph,请不要输入这足以:

registerEvent(EVT_INIT, &UpdaterComponent::initialise, std::placeholders::_1);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章