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_派生的
数据。我怎么能用变量模板、函数指针和模板变量来伪造这样的东西呢


澄清:我不想键入erase
ARGS
。呼叫方和被呼叫方都应该知道它们。我只想删除数据,答案很简单。你没有

C++中支持单个类型的参数集停止完成;您甚至不能对一个单一的

数据类型执行此操作,在该类型中,您可以删除已知表中的所有有效参数


最重要的是,从类派生的类型集在任何地方都不能使用动态链接,甚至在链接时都不知道。

使用
C
可变参数可以解决
ABI
问题,但我不知道它是否可以与关键字
virtual
一起使用。

我不想删除
args
。我只想擦除
数据
。您真的需要
poly_base
?您不能直接将模板函数与
poly_-derived
一起使用吗?我需要的函数已经通过
ARGS…
模板化了。不幸的是,我想在实际存储不同数据类型的
poly_base
容器的元素上使用它。在更传统的C++中,这将是指向不同派生类型的抽象基指针的向量。