2017-03-09 97 views
4

假设有A类和MyType的访问嵌套的模板类型

template<typename DataType> 
class MyType { 
... 
} 

template<typename MyType> 
class A { 
... 
} 

当我我怎么可以访问内部的模板int类型创建一个与A<MyType<int>>的实例?

+2

您可以在MyType中添加'typdef',并在'A'中使用它。 – songyuanyao

+3

你有错别字吗?什么是“A with A”和“A中的int类型”? – ThomasMcLeod

+0

对不起。修正了它 – Gustavo

回答

3

另一种方法是这样的:

template <typename DataType> 
class MyType { ... }; 

template<typename X>   // template parameter name changed for clarity 
class A;      // intentionally left undefined 

template<typename Y> 
class A<MyType<Y>> { ...Y... }; // a specialisation 

... A<MyType<int>> ...   // Y in the definition of A is int 

这种方法只能用MyType的实例实例化A

如果有一个需要实例化一个与任何模板类型,一个使用有点不同的分工:

template<template<typename...> X, typename Y> 
class A<X<Y>> { ...X<Y>... }; // a specialisation 

... A<MyType<int>> ...   // X in the definition of A is MyType, Y is int 
... A<OtherType<double>> ... // X is OtherType, Y is double 

这种方法,人们可以通过不具有非类型模板参数的任何模板类型。

+0

如果存在另一种类型而不是MyType并且我想访问Y.我的意图是访问MyType或任何其他类型的第一个模板类型 – Gustavo

+0

@Gustavo为此添加了一种方法。 –

6

公开一个type alias给用户:

template<typename DataType> 
class MyType { 
public: 
    using InnerDataType = DataType; 
}; 

template<typename MyType> 
class A { 
public: 
    using InnerType = MyType; 
}; 

用法:

using MyA = A<MyType<int>>; 
static_assert(std::is_same< 
    typename MyA::InnerType::InnerDataType, 
    int>{}); 

live example on wandbox

+0

值得一提的是,这是“像标准库一样”的好例子 - 容器,迭代器和库中的每个模板都很明显。 –