【发布时间】:2022-09-21 17:55:02
【问题描述】:
我正在尝试在下面编写此代码:
// Type your code here, or load an example.
#include <iostream>
class A
{
public:
virtual void virFunc1(int a) = 0;
virtual void virFunc2(int a) = 0;
void func1(int a)
{
onTempFunc(this->virFunc1, a);
}
void func2(int a)
{
onTempFunc(this->virFunc2, a);
}
private:
template <typename ImplFunc, typename... Args>
void onTempFunc(ImplFunc impl_func, Args&&... args)
{
impl_func(args...);
}
};
class B : public A
{
public:
void virFunc1(int a) override
{
std::cout << \"virFunc1: \" << a << std::endl;
}
void virFunc2(int a) override
{
std::cout << \"virFunc2: \" << b << std::endl;
}
};
int main()
{
auto* A = new B();
A->func1(2);
A->func2(3);
}
但是在 Godbolt 中编译失败:https://godbolt.org/z/dq4szorq7 并出现错误:error: invalid use of non-static member function \'virtual void\'。基本上我想将虚拟方法及其参数传递给函数模板。函数模板将在其中调用该虚拟方法。不同的虚方法可以有不同的函数签名,这就是我将onTempFunc作为函数模板的原因。 C++ 有没有办法做到这一点?
-
将
onTempFunc(this->virFunc1, a)替换为onTempFunc(&A::virFunc1, a)。还将impl_func(args...)替换为(this->*impl_func)(args...)。请参阅 answer 和 working demo。 -
考虑使用
std::invoke而不是尝试正确获取成员指针语法。 -
@StoryTeller-UnslanderMonica 是的,
std::invoke用于 dupe。
标签: c++ polymorphism c++17