C++ 中模板化别名的类型定义

Typedef of a templated alias in C++

本文关键字:类型 定义 别名 C++      更新时间:2023-10-16

我有一个以下模板类A

template<template<typename>class VectorT>
class A
{
//...
}

我像这样实例化:A<MyStdVector> objectA;其中MyStdVector是具有特定分配器 (MyAllocator) 的std::vector的别名:

template<typename T>
using MyStdVector = std::vector<T,MyAllocator>

我决定在A中创建一个名为Vector的别名:

template<template<typename>class VectorT>
class A
{
public:
template<typename T>
using Vector = VectorT<T>;
//...
}

这样A就可以在里面打电话给Vector<int>(而不是VectorT<int>)。 更重要的是,我想从另一个类Vector访问此别名B如何实现这一点

template<class A>
class B
{
public:
// How to define a type Vector which refers to A::Vector 
// such that inside B, Vector<int> refers to A::Vector<int>
// which refers to MyStdVector<int> 
}   

例如,为了在类B中创建属性Vector<int>。 所以我尝试了 3 件事(在类B内):

typedef typename A::Vector Vector;   //1
template<typename T>
using Vector = typename A::Vector;   //2
template<typename T>
using Vector = typename A::Vector<T> //3

但是编译器说,对于 2 个前解决方案,类型名A::Vector名称StdVector不是类型(我想它只被视为别名而不是类型?最后一个解决方案会产生语法错误。

这是我尝试编译的整个代码:

#include <vector>
template<typename T>
using MyStdVector = std::vector<T/*,MyAllocator*/>;
template<template<typename>class VectorT>
class A
{
public:
template<typename T>
using Vector = VectorT<T>;
//...
};
template<class A>
class B
{
public:
//    typedef typename A::Vector Vector;   // 1
//    template<typename T>
//    using Vector = typename A::Vector;   // 2
//    template<typename T>
//    using Vector = typename A::Vector<T>; // 3
Vector<int> m_vector;
};
int main(int argc, char *argv[])
{
A<MyStdVector> a;
B<A<MyStdVector>> b;
return 0;
}

我对typedefalias之间的区别感到困惑,尤其是当我想混合它们并且它们是模板化的时......

类型 3 添加template

template <typename T>
using Vector = typename A::template Vector<T>;

为了澄清您对typedef(C++98) 和别名声明(C++11) 之间区别的混淆:区别在于模板。

别名声明可以模板化,而 typedef 不能。

使用using使用用户定义的分配器将 myvector 声明为向量:

template<typename T>
using myvector = std::vector<T, myAllocator<T>>  // alias declaration
myvector<int> myIntVector; // client code

要对typedef做同样的事情,你必须在结构模板中嵌套typedef。

template<typename T>
struct myvector {
typedef std::vector<T, myAllocator<T>> type;
}
myvector<int>::type myIntVector; // client code

::type后缀很麻烦,而且你写的样板文件更少,using.这就是为什么你应该更喜欢别名声明而不是typedef。