C++ 如何在C++;?
以下代码是不可能的:C++ 如何在C++;?,c++,variadic-templates,dynamic-dispatch,C++,Variadic Templates,Dynamic Dispatch,以下代码是不可能的: struct poly_base { template <typename... ARGS> virtual void operator()(ARGS&&... args) = 0; }; template <typename DATA> struct poly_derived : public poly_base { DATA data; template <typename... ARGS&
struct poly_base {
template <typename... ARGS>
virtual void operator()(ARGS&&... args) = 0;
};
template <typename DATA>
struct poly_derived : public poly_base {
DATA data;
template <typename... ARGS>
void operator()(ARGS&&... args) override {
data(std::forward<ARGS>(args)...);
}
};
struct poly_base{
模板
虚空运算符()(ARGS&&…ARGS)=0;
};
模板
结构poly_派生:公共poly_基{
数据;
模板
void运算符()(ARGS&&…ARGS)重写{
数据(标准:转发(args)…);
}
};
在不依赖虚拟函数提供的动态多态性的情况下,我可以通过什么方式伪造这样的功能?最重要的是,如何在不限制操作符()
接受的参数类型(所有数据的交集所支持的参数类型除外)的情况下执行此操作
如果事先知道所需的ARGS&&…
组合,我会将必要的函数指针存储在poly_base
中,或者声明必要的纯虚拟函数。但是我如何在不限制参数类型的情况下做到这一点呢
如果可能的话,我希望编译器生成一个vtable,其中包含所有poly_base::operator()
重载的并集,这些重载在所有转换单元中调用,用于实例化poly_派生的
数据。我怎么能用变量模板、函数指针和模板变量来伪造这样的东西呢
澄清:我不想键入eraseARGS
。呼叫方和被呼叫方都应该知道它们。我只想删除数据,答案很简单。你没有
C++中支持单个类型的参数集停止完成;您甚至不能对一个单一的数据类型执行此操作,在该类型中,您可以删除已知表中的所有有效参数
最重要的是,从类派生的类型集在任何地方都不能使用动态链接,甚至在链接时都不知道。使用C
可变参数可以解决ABI
问题,但我不知道它是否可以与关键字virtual
一起使用。我不想删除args
。我只想擦除数据
。您真的需要poly_base
?您不能直接将模板函数与poly_-derived
一起使用吗?我需要的函数已经通过ARGS…
模板化了。不幸的是,我想在实际存储不同数据类型的poly_base
容器的元素上使用它。在更传统的C++中,这将是指向不同派生类型的抽象基指针的向量。