我有一个模板类,我想在另一个类中使用。问题是我想在不知道实际类型的情况下使用模板类。
一个简单的例子:
template <class T>
class Foo{
private:
T x_;
public:
void Foo(T);
};
现在,另一个使用Foo
的课程。我想做的是:
class Bar{
private:
Foo foo_;
public:
Bar(Foo);
};
问题是Foo
在Bar
内使用时需要模板参数。如果Bar
类使用任何模板参数处理Foo
,那将是很好的。有解决方法吗?
答案 0 :(得分:6)
让Bar
本身成为类模板:
template <typename T>
class Bar{
private:
Foo<T> foo_;
public:
Bar(Foo<T>);
};
或者,您可以在常见的多态接口下 type-erase Foo
。这限制了Foo
的使用,并引入了运行时和内存开销。
struct FooBase {
virtual ~FooBase() { }
virtual void Xyz(int) { }
};
template <class T>
class Foo : FooBase {
private:
T x_;
public:
void Foo(T);
void Xyz(int) override
{
// `T` can be used in the definition, but
// cannot appear in the signature of `Xyz`.
}
};
class Bar{
private:
std::unique_ptr<FooBase> foo_;
public:
Bar(std::unique_ptr<FooBase>&&);
};