C ++多态性与可变函数参数 [英] C++ polymorphism with variadic function parameter
问题描述
我与你分享一个问题,我得到了一个使用可变函数参数的类。它是下面代码中显示的Thread类。它是一个std :: thread的包装,以使用函数模式。
I am sharing with you an issue that I got with a class using variadic function parameters. It is the class Thread shown in the following code. It is a wrapper of std::thread in order to use the function pattern.
我想使用多态与这个函数继承Thread类到一个新类, Functor,但gcc返回以下错误:
I wanted to use polymorphism with this function in inheriting the class Thread into a new class, Functor, but gcc returns the errors bellow:
#include <thread>
#include <iostream>
using namespace std;
template<class... Args>
class Thread
{
public:
virtual void operator()(Args...) = 0;
void run(Args... args)
{
std::thread t(std::forward< Thread<Args...> >(*this), std::forward<Args>(args)...);
t.join();
}
};
template<class... Args>
class Functor : public Thread<Args...>
{
public:
// generates the errors bellow
virtual void operator()(Args... /*args*/)
{
}
// doesnot work since the pure virtual function wants another prototype of function.
// void operator()(int)
// {
// }
};
int main()
{
int a = 12;
Functor<int> f;
f.run(ref(a));
return 0;
}
from t-Thread-args2.cpp:1:
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.2/../../../../include/c++/4.7.2/tuple: In instantiation of ‘struct std::_Head_base, false>’:
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.2/../../../../include/c++/4.7.2/tuple:215:12: required from ‘struct std::_Tuple_impl, int>’
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.2/../../../../include/c++/4.7.2/tuple:507:11: required from ‘class std::tuple, int>’
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.2/../../../../include/c++/4.7.2/functional:1601:39: required from ‘struct std::_Bind_simple(int)>’
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.2/../../../../include/c++/4.7.2/thread:133:9: required from ‘std::thread::thread(_Callable&&, _Args&& ...) [with _Callable = Thread; _Args = {int}]’
t-Thread-args2.cpp:14:83: required from ‘void Thread::run(Args ...) [with Args = {int}]’
t-Thread-args2.cpp:42:17: required from here
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.2/../../../../include/c++/4.7.2/tuple:166:13: error: cannot declare field ‘std::_Head_base, false>::_M_head_impl’ to be of abstract type ‘Thread’
t-Thread-args2.cpp:7:7: note: because the following virtual functions are pure within ‘Thread’:
t-Thread-args2.cpp:10:18: note: void Thread::operator()(Args ...) [with Args = {int}]
我真的不理解错误,因为纯虚函数在derivedeted类中定义良好。但是,在将函数run()移动到派生类(Functor)中时,它是有效的。
I dont really understand the error since the pure virtual function was well defined in the deriveted class. However, in moving the function run() into the derivated class (Functor) it works.
提前感谢,
Caner
Thanks in advance, Caner
推荐答案
根据[thread.thread.constr]§3, std :: thread
构造函数
。在你的情况下, F&&&
,要求 F
MoveConstructible F
是线程
,这不是 MoveConstructible
。
As per [thread.thread.constr]§3, the type of the first argument of the std::thread
constructor is F&&
, with the requirement that F
is MoveConstructible
. In your case, F
is Thread
, which is not MoveConstructible
.
换句话说, std :: thread
需要按值存储函子,重新转发函数作为 Thread
,这是抽象的。
In other words, the std::thread
needs to store the functor by value, and you're forwarding the functor as Thread
, which is abstract.
这篇关于C ++多态性与可变函数参数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!