首页 > 解决方案 > 使用可变参数、函数参数和非参数模板参数调用模板成员函数

问题描述

我正在尝试使用定义为的模板成员函数:

  template <class HeaderClass, typename ...Args>
  void LoaderClass::loadHeader(std::function<HeaderClass(Args&&...)> headerGenerator, Args&&... argsForGenerator) {
    // stuff
    auto hdrPtr = new HeaderClass(headerGenerator(std::forward<Args>(argsForGenerator)...));
    /// more stuff
}

本质上,我想调用这个函数,它可以从一组变量参数中获取创建各种类(基础类的所有子类,fwiw)的实例的函数。

指定的函数在 GCC 9.x 上编译得很好,但我不知道调用它的正确方法。我在搜索时发现了许多类似的示例,但没有一个涉及 HeaderClass 模板参数未直接在函数签名中使用的情况。无论如何,从那些类似的例子中,我尝试过:

SpecialHeader headerMaker(int arg1, std::string arg2, float arg3) {
   // create and return a SpecialHeader instance
}

loader.loadHeader(&headerMaker, 1, "whatever", 3.5);  // Doesn't work, with or without &
loader.loadHeader<SpecialHeader>(&headerMaker, 1, "whatever", 3.5);  // Doesn't work
loader.template loadHeader<SpecialHeader>(&headerMaker, 1, "whatever", 3.5);  // Doesn't work

在每种情况下,我都会收到一些candidate template ignored: could not match 'function<SpecialHeader (type-parameter-0-1 &&...)>' against 'SpecialHeader (*)(int, string, float)'.

所以我的问题是,我究竟如何对我的函数进行有效调用?我当然不可能创造出不可调用的东西,不是吗?

标签: c++templatesvariadic-templates

解决方案


推荐阅读