Superclass for template <int v> class Foo

Superclass for template <int v> class Foo

假设我有一个模板class

template <int v>
class Foo {...}

我有一个功能

void f(...)

接受 Foo<1>、Foo<2> 等任何对象作为输入,我该如何定义该函数?好像

void f(Foo x) 

不编译。 Foo<1>、Foo<100>、...和所有 Foo 的常见类型是什么?

What is a common type for Foo<1>, Foo<100>, ... and all Foo?

没有通用类型。不过,您可以做的是也将 f 设为模板

template <int v>
void f(Foo<v> x)
{
    //code here
} 

像上面一样,现在该函数将接受您提供的任何 Foo

您只需制作 f 模板即可:

template <int v>
void foo(Foo<v> x)
{
    // code
}

正如其他人已经指出的那样,您可以使用 Foo 的现有定义并使用模板函数 foo。

如果您确实需要 Foo 模板的所有实例化的通用类型,您必须将其添加为 Foo 的基 class。

class FooBase {...};

template<int v>
class Foo : public FooBase {...};

然后您可以编写一个 foo 函数,它接受一个指针或对基 class 的引用。但这只有在你将一些虚函数添加到你在 Foo 模板 class:

中覆盖的基础 class 时才有意义
#include<iostream>

class FooBase {
  public:
    virtual int doubleIt() const = 0;
};

template<int v>
class Foo : public FooBase {
  public:
   int doubleIt() const {return 2*v;}
};

void foo(FooBase* x) {
  int d = x->doubleIt();
  std::cout << "x->double() is " << d << std::endl;
  // do stuff with d
}

int main() {
    Foo<2> a;
    foo(&a);

    Foo<3> b;
    foo(&b);
}

Demo Code