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);
}
假设我有一个模板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);
}