【问题标题】:How to dynamically add template parameter如何动态添加模板参数
【发布时间】:2020-02-06 15:37:09
【问题描述】:

我是 C++ 的新手,并且被一个实现卡住了。所以我的问题如下:

我有接口类,其中类的唯一区别是没有。其功能之一的参数。

例如:

class foo3()
{
    private:
       function3(a,b,c) {}
};

class foo5()
{
    private:
       function5(a,b,c,d,e) {}
};

为了概括这些并在不了解其内部功能的情况下使用它们,我创建了一个模板类 fooN 并使用了模板专业化,因此基于模板参数(int N)我可以选择正确的类对象并进行一些处理。

现在我有了创建 fooN 模板对象的算法

class algo {
     public:
         fooN<5> fooObj;
     private:
 }

是否可以在运行时动态分配此模板参数(5),或者是否有解决方法?

目前我正在使用 CMake 来静态设置模板参数。

【问题讨论】:

  • 你想过 std::tuple 吗?
  • 您到底想达到什么目的?为什么不直接创建一个带有任意数量参数的“foo”版本,或者通过使其成为可变参数模板(不是 C 风格的可变参数函数)或采用 std::initializer_list...?

标签: c++ c++11 templates c++14


【解决方案1】:

是否可以在运行时动态分配这个模板参数(5)

绝对不是。所有模板实例化都发生在编译时。

或者有解决办法吗?

也许吧。

您当然可以为一堆不同的值实例化fooN,并在运行时在它们之间进行选择。最简单的方法是这样的

int algo(int n)
{
  switch(n) {
  case 3: return algoImpl<3>();
  case 5: return algoImpl<5>();
  default: return -1;
  }
}

虽然您显然需要从某个地方获取参数。您可以合理地让每个 algoImpl&lt;N&gt; 获取参数值的(运行时)向量,将其转换为元组,然后使用 std::apply 调用您的底层函数。

目前我正在使用 CMake

致谢。

...静态设置模板参数。

哎呀。在构建配置文件中存储类型系统的部分感觉有点麻烦。你的构建系统知道你的代码不知道的 N 的正确值吗?

【讨论】:

    【解决方案2】:

    很遗憾,这是不可能的。模板参数需要在编译时知道

    当编译器遇到这个对模板函数的调用时,它 使用模板自动生成一个函数替换每个 作为实际模板传递的类型的 myType 外观 参数(在这种情况下为 int),然后调用它。这个过程是 由编译器自动执行,对 程序员。

    source

    意味着模板可以使用的所有值都需要在编译时知道。

    你可以做的是the following

    MyClassInterface* Factor(int p1, int p2, int p3) {
      if (p1 == 0 && p2 == 0 && p3 == 0)
        return new MyClass<0,0,0>();
      if (p1 == 0 && p2 == 0 && p3 == 1)
        return new MyClass<0,0,1>();
      etc;
    }
    

    但是由于您想要一个任意数字N,我认为这对您来说不是一个可行的解决方案。您可以尝试添加一个预处理器宏来为N 的任意值生成函数,但老实说,我不会那样做。它会使你的可执行文件变得非常大,并为你的编译时间增加很多时间。

    您也许可以找到类似于您尝试使用initializer lists 的解决方案。 这会让你做类似的事情

    my_type Var = {1, 2, 3, 4, 5, 6, ..., N};
    

    您可以将这样的列表用作函数的参数。

    希望这对您想要实现的目标有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-03
      • 1970-01-01
      • 2019-02-21
      • 1970-01-01
      • 2020-06-05
      • 2020-01-26
      • 1970-01-01
      相关资源
      最近更新 更多