0

ステートレス メモリ プール アロケータ クラスがあります。

template<typename T>
class pool_allocator {
public:
    using value_type = T;
    using pointer = value_type *;

    /* Default constructor */
    constexpr pool_allocator( void ) noexcept = default;

    /* Converting constructor used for rebinding */
    template<typename U>
    constexpr pool_allocator( const pool_allocator<U> & ) noexcept {}

    [[nodiscard]] pointer allocate( size_t n, [[maybe_unused]] const pointer hint = nullptr ) const noexcept {
        return get_pool().allocate( n );
    }

    void deallocate( pointer ptr, size_t n ) const noexcept {
        get_pool().deallocate( ptr, n );
    }

private:
    /* Must be defined in particular .cpp files */
    /* POINT OF INTERREST HERE: */
    static auto & get_pool( void ) noexcept;
};

背後にあるロジックはget_pool()、T のインスタンスが割り当てられる定義済みの型の特定のメモリ プールを返すことを目的としたメンバー関数の特殊化です。たとえば、次のようになります。

class sample { ... };

.cpp ファイル:

memory_pool<sample, 10> sample_storage;  // memory pool capable of holding up to 10 instances of 'sample'

最後に、.cpp ファイルの get_pool() 関数テンプレートの特殊化があります。

template<>
auto & pool_allocator<sample>::get_pool( void ) noexcept {
    return sample_storage; // return the memory_pool instance defined above
}

問題は、そのようなテンプレートの特殊化が .cpp コンパイル ユニットでのみ使用可能であり、他のコンパイル ユニットでの使用を妨げることです(関数テンプレートの特殊化の本体が使用できないため、プレースホルダーauto get_pool()のタイプをauto推測できません)。get_pool()

autoそのため、 の戻り値の型としてどうにかして取り除きたいと思いget_pool()ます。

memory_pool私が直面している問題は、主にアロケータ自体が認識していないのサイズに関するものです。とにかく、memory_pool は私の実装でもあるので、必要な採用 (たとえば、さらなるusing宣言やその他の必要なもの) を行うことができます。それのちょうど骨組み:

template<typename T, size_t CAPACITY>
class memory_pool {
public:
    using element_type = T;
    using pointer = element_type *;

    constexpr size_t capacity( void ) noexcept {
        return CAPACITY;
    }
...
};
4

1 に答える 1