gpt4 book ai didi

c++ - 模板参数接受指向类成员函数的指针

转载 作者:太空狗 更新时间:2023-10-29 20:53:44 25 4
gpt4 key购买 nike

#include <utility>

class Base {
public:
virtual ~Base() {}
virtual void base() {}
};

class Derived : public Base {
public:
virtual void derived() {}
};

template<typename... Params>
using MemberFuncPtr = void(Derived::*)(Params...);

template<typename... Params, typename... Args>
void wrapper(MemberFuncPtr<Params...> ptr, Args&&... args)
{
Derived* d = new Derived();

(d->*ptr)(std::forward<Args>(args)...);

delete d;
}

int main()
{
wrapper(&Derived::derived);
wrapper(&Derived::base);
return 0;
}

尝试运行此代码 (GCC 7.0) 时出现以下错误:

prog.cc: In function 'int main()':
prog.cc:33:27: error: no matching function for call to 'wrapper(void (Base::*)())'
wrapper(&Derived::base);
^
prog.cc:18:6: note: candidate: template<class ... Params, class ... Args> void wrapper(MemberFuncPtr<Params ...>, Args&& ...)
void wrapper(MemberFuncPtr<Params...> ptr, Args&&... args)
^~~~~~~
prog.cc:18:6: note: template argument deduction/substitution failed:
prog.cc:33:27: note: mismatched types 'Derived' and 'Base'
wrapper(&Derived::base);
^

我真的不明白为什么来自基类的方法是个问题?它也是派生类的一种方法。我做了简单的测试,我将 Derived::base 分配给 Derived::*ptr 类型并且有效。

最佳答案

I don't really understand why method from the base class is an issue?

这只是类型的问题。 &Derived::derived的类型是void (Derived::*)(),但是&Derived::base的类型是void (Base::*)()。这与 void (Derived::*)(Args...) 不匹配,因此推导失败。模板推导不允许转换,即使在这种情况下存在有效的转换也是如此。

I've done simple test where I assigned Derived::base to Derived::*ptr type and that worked.

这个:

MemberFuncPtr<> d = &Derived::base;
wrapper(d);

之所以有效,是因为现在 d 是正确的类型(它现在 确实 匹配 void (Derived::*)(Args...)),并且第一行很好,因为将指向基类成员的指针转换为指向派生类成员的指针是有效的。

关于c++ - 模板参数接受指向类成员函数的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41831205/

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