STL中所有支持allocator的类模板都必须使用分配器类型进行实例化。如果分配器不是模板参数而是模板 模板参数,对用户来说不是更方便吗?
为了演示,std :: vector和std :: basic_string类模板分别具有以下签名:
template<class T, class Allocator = std::allocator<T>> class vector;
template<class CharT, class Traits = std::char_traits<CharT>, class Allocator = std::allocator<CharT>> class basic_string;
如果我有自定义分配器:
template <typename T>
class MyAllocator
{
// ...
};
并希望实例化一个字符串向量,它使用我的自定义分配器来为向量和字符串的内部字符数组分配内部存储,事情很快变得尴尬:
typedef std::vector<std::basic_string<char, std::char_traits<char>, MyAllocator<char> >, MyAllocator<std::basic_string<char, std::char_traits<char>, MyAllocator<char>>>> CustomAllocStringVector;
使用额外的typedef,可以稍微简化一下:
typedef std::basic_string<char, std::char_traits<char>, MyAllocator<char>> CustomAllocString;
typedef std::vector<CustomAllocString, MyAllocator<CustomAllocString>> CustomAllocStringVector;
但困扰我的是,为什么强迫用户明确指定分配器的完整类型?如果我将分配器用于 char 的向量,那么不应该说分配器将是分配器类型&lt; char &gt;?
如果std :: vector和std :: basic_string的签名是:
template<typename T, template <typename ElementType> class AllocatorType = std::allocator> class vector;
template<typename CharT, typename Traits = std::char_traits<CharT>, template <typename ElementType> class AllocatorType = std::allocator> class basic_string;
与上面相同的矢量类型可以更简单地类型定义为:
typedef std::basic_string<char, std::char_traits<char>, MyAllocator> CustomAllocString;
typedef std::vector<CustomAllocString, MyAllocator> CustomAllocStringVector;
当然,我的方式是要求所有分配器都是模板,但是任何可以重复使用的分配器类都不能满足这个要求吗?
我确信这是有充分理由的,但目前我没有看到它。
答案 0 :(得分:2)
这将引入一个要求,即分配器类型是一个只有一个模板参数的类模板,专门用于容器的value_type
。您的提案将取消
template<typename T, unsigned int PoolNumber = 0>
class my_allocator;
作为有效的分配器。
与此同时,我可以简单地使用我已经拥有的typedef
作为我的分配器类型,而不需要将它拆开或重复其模板名称:
template<typename T> class my_allocator;
typedef my_allocator<int> int_allocator;
std::list<int, int_allocator> ... // valid currently, difficult to express with your proposal