代码之家  ›  专栏  ›  技术社区  ›  Filipp

如何在C++中伪造虚拟变量函数模板?

  •  2
  • Filipp  · 技术社区  · 7 年前

    以下代码不可能:

    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)...);
        }
    };
    

    在不依赖虚拟函数提供的动态多态性的情况下,我可以用什么方式伪造这种功能?最重要的是,我如何才能做到这一点而不限制 operator() ,但由所有 DATA ?

    如果 ARGS&&... 需要提前知道,我会将必要的函数指针存储在 poly_base 或者声明必要的纯虚拟函数。但是我如何才能在不约束参数类型的情况下做到这一点呢?

    如果可能的话,我希望编译器生成一个vtable poly_base::operator() 在所有翻译单元中为每个调用重载 数据 用什么 poly_derived 已实例化。如何使用变量模板、函数指针和模板变量来伪造这样的东西?

    澄清:我不想打字删除 ARGS . 它们应该被呼叫者和被呼叫者知道。我只想擦掉 数据 .

    2 回复  |  直到 7 年前
        1
  •  0
  •   Yakk - Adam Nevraumont    7 年前

    答案很简单。你没有。

    在C++中支持单个类型的参数集是完全停止的;对于A,您甚至不能这样做。 单一的 DATA 键入要删除已知表中所有有效参数的位置。

    除此之外,从类派生的类型集在任何具有动态链接的地方都不可用,甚至在链接时都不知道。

        2
  •  0
  •   JiaHao Xu    7 年前

    使用 C 变量参数可以修复 ABI 有问题,但我不知道它是否可以和关键字一起使用 virtual .