Templates 默认情况下,在stl容器中为给定模板化类型使用自定义分配器

Templates 默认情况下,在stl容器中为给定模板化类型使用自定义分配器,templates,c++11,stl,eigen,partial-specialization,Templates,C++11,Stl,Eigen,Partial Specialization,我的特殊用例是,对于我所工作的一些较新的开发人员,尝试减少使用带有Egeng的stl容器所需的锅炉板代码,但这个问题可以更普遍地应用。首选惯用的C++11 鉴于以下情况: template<int i, int i> MyClass { ... }; template<class C> MyAllocator { ... }; 当向量的值类型为MyClass时,如何编写std::vector或任何其他默认使用MyAllocator的stl容器类型的专门化 我在想,在艾根

我的特殊用例是,对于我所工作的一些较新的开发人员,尝试减少使用带有Egeng的stl容器所需的锅炉板代码,但这个问题可以更普遍地应用。首选惯用的C++11

鉴于以下情况:

template<int i, int i> MyClass { ... };
template<class C> MyAllocator { ... };

当向量的值类型为MyClass时,如何编写std::vector或任何其他默认使用MyAllocator的stl容器类型的专门化

我在想,在艾根的矩阵类中,答案可能是这样的:

namespace std{
  template<typename _S, int _A, int _B, int _C, int _D, int _E>
  vector< Eigen::Matrix<_S, _A, _B, _C, _D, _E> > :
    public vector< 
      Eigen::Matrix<_S, _A, _B, _C, _D, _E>, 
      Eigen::aligned_allocator<
        Eigen::Matrix<_S, _A, _B, _C, _D, _E>
      >
    >
  {};
}
这甚至还不接近于编译,但我认为它传达了我正在尝试做的事情。我真的希望避免使用本征定义STL向量专门化,或者任何需要对每个支持的类型置换进行显式专门化的方法

我考虑过的另一种方法是使用模板别名,如下所示:

namespace MyNamespace {
  template<typename T>
  vector = std::vector<T, MyAllocator<T>>;

  template<typename _K, typename _V, typename _C = std::less<_K>>
  using map = std::map<_K, _V, _C, Eigen::aligned_allocator<std::pair<_K, _V>>>;
}
这有可能被误用,但确实大大减少了样板代码。C++11或C++14标准中是否有任何东西支持这种行为?我假设这在C++11之前是不可能的,因为我认为如果不是这样,Eigen社区可能已经做到了

编辑/答复:

经过与大学的进一步思考和讨论,我试图做的可能是一个坏主意,因为它会导致令人惊讶的行为std::分配器在某些情况下表现为本征::对齐_分配器


最好的选择似乎是模板别名,因为它可以清楚地显示发生了什么。专门化容器,甚至专门化std::allocator都会导致人们在查看代码时认为我们没有正确使用容器,如果他们没有意识到我们所做的奇怪事情的话。我仍然希望看到Eigen使用一些较新的c++11特性来提高分配器的要求,但这可能会发生在库级别。如果有人知道如何专门化std::allocator\u traits>来使用对齐的\u分配器,我很想知道,但目前,模板别名似乎是最容易理解和实现的选项。

当向量的值类型为MyClass时,如何编写std::vector或默认使用MyAllocator的任何其他stl容器类型的专门化vector的专门化意味着MyClass已经被指定,所以没有时间了。另外,您已经将MyClass显示为模板,而不是类。听起来您想要使用MyVector=std::vector>的模板别名,或者用户定义的std::allocator专门化。std::allocator的专门化确实更符合我的要求,但即使这样也不足以满足eigen,因为我还需要专门化std::allocator和std::allocator,然后上帝才知道元组或其他容器类型是什么。。。