分配器类型参数的C ++设计模式

问题描述

| 当将类型传递给要作为分配器的类时,C ++ 03标准库使用简单的模板类型参数。这是可能的,因为模板是如何在C ++中工作的。但是,它不是很简单,您可能不知道类型定义应该是什么样子-特别是在非标准类型的情况下。 我认为使用instread适配器类可能是一个好主意。我创建了一个示例,向您展示我的意思:
#ifndef HPP_ALLOCATOR_ADAPTOR_INCLUDED
#define HPP_ALLOCATOR_ADAPTOR_INCLUDED


#include <memory>


template<typename T>
struct allocator_traits;

template<typename T,class allocator_type = std::allocator<T>>
class allocator_adaptor;


template<>
struct allocator_traits<void>
{
    typedef std::allocator<void>::const_pointer const_pointer;
    typedef std::allocator<void>::pointer       pointer;
    typedef std::allocator<void>::value_type    value_type;
};

template<typename T>
struct allocator_traits
{
    typedef typename std::allocator<T>::const_pointer   const_pointer;
    typedef typename std::allocator<T>::const_reference const_reference;
    typedef typename std::allocator<T>::difference_type difference_type;
    typedef typename std::allocator<T>::pointer         pointer;
    typedef typename std::allocator<T>::reference       reference;
    typedef typename std::allocator<T>::size_type       size_type;
    typedef typename std::allocator<T>::value_type      value_type;
};


template<class allocator_type>
class allocator_adaptor<void,allocator_type>
    : public allocator_traits<void>
{
public:
    template<typename U> struct rebind { typedef allocator_adaptor<U,allocator_type> other; };
};

template<typename T,class allocator_type>
class allocator_adaptor
    : public allocator_traits<T>
{
private:
    allocator_type m_impl;

public:
    template<typename U> struct rebind { typedef allocator_adaptor<U,allocator_type> other; };

    allocator_adaptor() throw() /*noexcept*/;
    allocator_adaptor(allocator_adaptor const&) throw() /*noexcept*/;
    allocator_adaptor(allocator_type const&) throw() /*noexcept*/;
    template<typename U> allocator_adaptor(allocator_adaptor<U,allocator_type> const&) throw() /*noexcept*/;
    ~allocator_adaptor() throw();

    pointer       address(reference x) const /*noexcept*/;
    const_pointer address(const_reference x) const /*noexcept*/;

    pointer   allocate  (size_type,allocator_traits<void>::const_pointer hint = 0);
    void      deallocate(pointer p,size_type n) /*noexcept*/;
    size_type max_size  () const throw() /*noexcept*/;

    template<class U,typename... argument_types> void construct(U* p,argument_types&&... args);
    template<class U> void destroy(U* p);
};


#endif /* HPP_ALLOCATOR_ADAPTOR_INCLUDED */
实施应该是显而易见的。 这是一些用法示例。
template<class allocator_type>
int max_size(allocator_type const& alloc)
{
    // we don\'t kNow what kind of max_szie function will be called.
    return alloc.max_size();
}

template<typename T>
int max_size(allocator_adaptor<T> const& alloc)
{
    // we kNow what kind of max_size function will be called.
    return alloc.max_size();
}
与常规方式相比,这是否有所改善?     

解决方法

        实际上,您的意思是介绍一个基于可变参量的
construct
成员,您可以用它代替:
typedef std::allocator<T> my_alloc;
my_alloc alloc;
my_alloc::pointer p = alloc.allocate(10);
alloc::construct(p,T(param1,param2,param3));
alloc::construct(p+1,param3));
//...
一些简单的形式:
alloc::construct(p,param1,param3);
alloc::construct(p+1,param3);
这似乎是一个不错的功能。另一方面,您移动了所有初始化参数,这将禁止正确地初始化p + 1对象。如果我想为多个对象重复相同参数的初始化该怎么办。我认为您当前的方法将会失败(不幸的是不会在编译时)。     ,        在我看来很好... 最好能解释一下您的设计何时会以通常的方式发挥优势。一个例子对我很有帮助   \“但是,不是很   直截了当,您可能不会   确切知道类型定义是什么   应该看起来像“ 与std :: allocator相比,您的实现如何改进-type definition-部分。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...