gpt4 book ai didi

c++ - “变量”不是类型 'pointer to member function' 的有效模板参数

转载 作者:搜寻专家 更新时间:2023-10-31 01:42:35 25 4
gpt4 key购买 nike

我对 C++ 和模板都很陌生,我正在尝试改编一个可用于从成员函数创建委托(delegate)的帮助程序类。

我更改了这段代码(编译):

Delegate<void, int, int>* cheaty(void (Renderer::*method)(int, int), Renderer* obj)
{
auto maker = DelegateMaker<Renderer, void, int, int>();
return maker.BindPointer<&Renderer::MoveCamera>(obj);
}

对此:

 Delegate<void, int, int>* cheaty(void (Renderer::*method)(int, int), Renderer* obj)
{
auto maker = DelegateMaker<Renderer, void, int, int>();
return maker.BindPointer<method>(obj);
}

无法编译并出现以下错误:error: 'method' is not a valid template argument for type 'void (Engine::Renderer::*)(int, int)' .由于 C++ 模板的限制,我试图实现的目标是不可能的吗?或者我只是错过了一些非常明显的东西?

编辑:理想情况下,我想要的是这样的功能:

    template<typename T, typename return_type, typename... params>
Delegate<return_type, params...>* make_delegate_pointer(return_type (T::*name)(params...), T* obj)
{
DelegateMaker<T, return_type, params...> maker = DelegateMaker<T, return_type, params...>();
return maker.BindPointer<name>(obj);
}

然后这样调用它auto delegate = Delegates::make_delegate_pointer(&Class::Method, &classInstance);只是,我一直遇到的问题是这样调用 BindPointer 之间似乎有一些区别 maker.BindPointer<&Class::Method>(classInstance);并这样调用它 maker.BindPointer<return_type (Class::*)(arguments...)>(classInstance); .

然而,return_type (T::*)(params...) memberFuncPointer = &Class::Method编译得很好。这意味着逻辑上,maker.BindPointer<return_type (T::*)(params...)>(classInstance)也应该编译(或者一些变体,这就是为什么在原始问题中我试图使用 method 作为 void (Renderer::*method)(int, int) )。但事实并非如此。

最佳答案

模板参数值必须在编译时知道,但是你的method值直到运行时才知道,因为cheaty()不知道的哪个方法Renderer 被传递给它。因此编译器错误。您将不得不更改 BindPointer 以不再使用模板。此外,DelegateMaker 已经知道方法签名,因此您无需在 BindPointer() 中复制该信息作为模板参数,让它继承 DelegateMaker 的值

例如(未经测试,可能需要一些调整,但您应该了解总体思路):

template <typename ReturnType, typename... ParamTypes>
class Delegate
{
public:
virtual ReturnType Invoke(ParamTypes... params) = 0;
};

template <typename ClassType, typename ReturnType, typename... ParamTypes>
class DelegateMaker
{
public:
typedef ReturnType (ClassType::*MethodType)(ParamTypes... params);

private:
class DelegateImpl : public Delegate<ReturnType, ParamTypes...>
{
private:
ClassType* _obj;
MethodType _method;

public:
DelegateImpl(ClassType *obj, MethodType method)
: _obj(obj), _method(method)
{
}

virtual ReturnType Invoke(ParamTypes... params)
{
return (_obj.*_method)(params);
}
};

public:
Delegate<ReturnType, ParamTypes...>* BindPointer(MethodType method, ClassType *obj)
{
return new DelegateImpl(obj, method);
}
};

template <typename ClassType, typename ReturnType, typename... ParamTypes>
Delegate<ReturnType, ParamTypes...>* make_delegate_pointer(
DelegateMaker<ClassType, ReturnType, ParamTypes...>::MethodType method,
ClassType* obj)
{
DelegateMaker<ClassType, ReturnType, ParamTypes...> maker;
return maker.BindPointer(method, obj);
}

auto delegate = Delegates::make_delegate_pointer(&Class::Method, &classInstance); 

关于c++ - “变量”不是类型 'pointer to member function' 的有效模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26619661/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com