C++ 中模板化别名的 Typedef
Typedef of a templated alias in C++
我有以下模板 class A
:
template<template<typename>class VectorT>
class A
{
//...
}
我这样实例化:A<MyStdVector> objectA;
其中 MyStdVector
是 std::vector
的别名,具有特定的分配器 (MyAllocator
):
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>
)。
更重要的是,我想从另一个 class B
访问这个别名 Vector
。 如何实现 :
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>
}
例如,为了在 class B
中创建属性 Vector<int>
。
所以我尝试了 3 件事(在 class 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
但是编译器说 typename A::Vector
名称 StdVector
不是类型(我想它只被视为别名而不是类型?)对于第一个 2 个解决方案。最后一个解决方案会产生语法错误。
这是我尝试编译的全部代码:
#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;
}
我对 typedef
和 alias
之间的区别感到困惑,尤其是当我想混合它们并且它们被模板化时...
类型 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 的原因。
我有以下模板 class A
:
template<template<typename>class VectorT>
class A
{
//...
}
我这样实例化:A<MyStdVector> objectA;
其中 MyStdVector
是 std::vector
的别名,具有特定的分配器 (MyAllocator
):
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>
)。
更重要的是,我想从另一个 class B
访问这个别名 Vector
。 如何实现 :
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>
}
例如,为了在 class B
中创建属性 Vector<int>
。
所以我尝试了 3 件事(在 class 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
但是编译器说 typename A::Vector
名称 StdVector
不是类型(我想它只被视为别名而不是类型?)对于第一个 2 个解决方案。最后一个解决方案会产生语法错误。
这是我尝试编译的全部代码:
#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;
}
我对 typedef
和 alias
之间的区别感到困惑,尤其是当我想混合它们并且它们被模板化时...
类型 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 的原因。