C++ 中模板化别名的类型定义
Typedef of a templated alias in C++
我有一个以下模板类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;
}
我对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。
相关文章:
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- 列表参数的类型定义
- 使用模板化的键类型定义 std::map,该键类型基于作为参数接收的函数
- 关于 C++ 中的函数类型定义
- C++(和 ROS) - 包含与前向声明引用,设置默认值和类型定义
- 将使用/类型定义限制为类范围
- 模板类型定义?
- C++:模板类的类型定义
- 如何对命名空间限定类型进行类型定义?
- 此递归模板类型定义是否有效C++?
- 具有调整对齐方式的类型定义
- C++从抽象类型定义类成员
- 用于C++代码的 API 监视器类型定义 (XML)
- 如何将result_of与函数类型定义一起使用
- 在C++的适当类型定义位置
- 如何根据模板类型定义浮点常量?
- 如何为缺少预定义运算符而不扩展命名空间"std"的标准类型定义运算符>> (istream &, ...)?
- 参数化类的别名(或类型定义)内部类
- 如果我想从类型"T"定义元素的容器(来自 STL),那么"T"必须使用默认构造函数?