我有一些像这样的代码
class A : public b<T>
{
public:
typedef b<T> _baseclass; // why we need this declaration
};
这里的_baseclass是什么?
答案 0 :(得分:1)
此成员类型也将在类定义的外中可用,这在模板代码中很方便。如果您将A
传递给函数模板,或者其他一些也有_baseclass
个成员类型的类,那么您可以使用_baseclass
找出基础是什么而不需要知道究竟是什么顶级类型。
std::vector
和std::map
等标准模板的成员类型如value_type
- 这些类型不代表基类,但具有相似的目的,因为您可以使用value_type
无论使用哪个容器,都可以在任何地方使用容器。
将typedef
换成using
(因为我想),这是一个例子:
// The class templates
template <typename T>
struct Base {};
struct A : Base<int>
{
using base_class = Base<int>;
};
struct B : Base<char>
{
using base_class = Base<char>;
};
struct C : Base<bool>
{
using base_class = Base<bool>;
};
// The example
template <typename T>
void foo()
{
// typename needed because base_class is a "dependent name"
// (just go with it)
typename T::base_class the_base;
// This line is to suppress "unused variable" warnings
(void)the_base;
}
int main()
{
foo<A>();
foo<B>();
foo<C>();
}
虽然这个特定的程序实际上并没有“做任何事情”,但是它显示了一个函数模板foo
,它可以“知道”每种情况下基类是什么,而没有关于究竟是什么{{1是的。它适用于您添加了T
成员类型的任何类!