模板化类中的嵌套类型

时间:2016-01-29 16:07:06

标签: c++ templates types

我有一个模板化的类Foo,我想要输入智能指针。

AFAIK我不能在课外输入这个。下面的代码(或其变体)不起作用。

template<typename T>
typedef shared_ptr< Foo<T> > Foo_Ptr<T>; 

所以我在类中有typedefed shared_ptr和weak_ptr。

template<typename T>
class Foo {
public:
    typedef shared_ptr< Foo<T> > Ptr;
    typedef weak_ptr< Foo<T> > WeakPtr;
};

这很烦人,因为我现在无法在其他标题中声明它。

但我的问题是,每当我想要声明一个Foo :: Ptr时,我必须在它之前使用typename。 e.g。

template<typename T>
class Bar {
   void do(typename Foo<T>::Ptr p);
}

这种语法有点麻烦,实际上写shared_ptr<Foo<T>>

的速度更快

还有其他选择吗?即一种在任何模仿T的上下文中声明Foo :: Ptr(甚至Foo :: Ptr)的方法? (例如在班级栏内?)

EDIT。

根据丹尼斯的回答,我想考虑一下这个

types.h中

template<typename T>
class Foo;

template<typename T>
using Foo_Ptr = std::shared_ptr< Foo<T> >;

template<typename T>
class Bar;

template<typename T>
using Bar_Ptr = std::shared_ptr< Bar<T> >;

foo.h中

#include "types.h"
template<typename T>
class Foo {
public:

};

别处

#include "Foo.h"

template<typename T>
void do_sth(Foo_Ptr<T> p) {
}

1 个答案:

答案 0 :(得分:3)

您可以引入一个using的别名,就像stdlib为type_traits(like std_enable_if_t)所做的那样,它不需要typename关键字:

using foo_ptr_t = typename Node<T>::Ptr;

一个可能的例子是:

#include <memory>

template<typename>
struct Foo { };

template<typename T>
class Node {
public:
    typedef std::shared_ptr<Foo<T>> Ptr;
    typedef std::weak_ptr<Foo<T>> WeakPtr;
};

template<typename T>
using foo_ptr_t = typename Node<T>::Ptr;

void do_sth(foo_ptr_t<int> p) { }

<强> Demo