如果不知道所有细节,请使用模板作为成员

时间:2010-12-27 07:17:14

标签: c++ templates

是否可以将模板指定为成员但不知道所有细节?或者我怎样才能解决这个问题。

示例不起作用,但可能会告诉您我正在尝试实现的目标。

template<typename T>
struct Foo {
   ///blah...
};

struct Bar {
    Foo* m_foo;
};
在这种情况下,

Bar是一个基类,根据派生类,我不知道Foo

的完整细节

2 个答案:

答案 0 :(得分:5)

您也可以将Bar设为模板类,以便将该模板参数传递给Foo,否则您可以使所有Foo<T>变体从公共接口继承(在C ++中,接口只是一个没有实现的抽象类,所有成员都是纯虚函数),然后Bar可以指向该接口。

如果Bar只是提供一些将被一堆派生类重用的功能,第一种方法会更好。

如果Bar的后代将以多态方式使用,第二种方式会更好。

答案 1 :(得分:0)

上面的代码不起作用,因为无论何时使用C ++模板,都必须指定它的参数。如果要存储未知类型的Foo,可以通过参数化某种类型的Bar(例如,使其成为类型参数为T的模板),然后让Bar存储Foo来实现。这与Java之类的其他语言形成鲜明对比,其中像上面概述的代码是合法的,因为模板在C ++中的工作方式不同。特别是,Java风格的遗传只是编译成一个具体的表示,然后使用运行时检查来验证它们是否正确使用。 C ++模板实例化最终都被编译成单独的代码,因此编译器必须能够在编译时推断出参数类型是什么(因此它知道要生成什么代码)。