我的特殊用例是尝试减少使用带有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,但是现在模板别名似乎是最容易理解的(也是最容易实现的)选项。