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

时间:2014-08-19 04:53:25

标签: templates c++11 stl eigen partial-specialization

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

鉴于以下内容:

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

如果向量的Value类型是MyClass,你会如何写一个std :: vector(或任何其他stl容器类型)的特化,默认情况下会使用MyAllocator?

我在思考答案,就Eigen的Matrix类而言,可能看起来像这样:

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>
      >
    >
  {};
}

这甚至不接近编译,但我认为传达了我想要做的事情。我真的希望避免使用EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION或任何需要对该类型的每个受支持的排列进行显式特化的方法。

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

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 :: allocator表现为Eigen :: aligned_allocator)

最好的选择似乎是模板别名,因为它清楚地说明了发生了什么。专门研究容器,甚至专门化std :: allocator会导致人们查看代码并认为如果他们不知道我们做过的奇怪事情,我们就没有正确使用容器。我仍然希望看到Eigen使用一些较新的c ++ 11特性来改进分配器要求,但这应该发生在库级别。如果有人知道如何专门化std :: allocator_traits&gt;使用我很想知道的aligned_allocator,但是现在模板别名似乎是最容易理解的(也是最容易实现的)选项。

0 个答案:

没有答案
相关问题