【发布时间】:2013-06-11 06:04:57
【问题描述】:
经常,我想为不同的 STL 容器专门化一个函数。但是我不想一一专门化,因为它们中的一些共享大部分需要的接口,例如 std::vector 和 std::deque。
在我的用例中,主要有三个类别(vector-like、set-like、map-like)。 例如,我想实现类似的东西,
template <class T>
struct A {
template <class Y, class... Z>
void func( Y y , Z... z ){
//hypothetical static_if
static_if ( T is similar to vector, deque, or boost::stable_vector etc which have push_back ) {
t.push_back(y);
}
else static_if ( T is similar to set, unordered_set or boost::flat_set etc which have emplace) {
t.emplace(y);
}
else static_if ( T is similar to map, unordered_map or boost::flat_map etc which has emplace) {
t.emplace(y, z...);
}
}
T t;
};
我认为这似乎是不可能的,但我希望有一些针对这种情况的 hack。 如果它可以扩展到列表类型(std::list, std::forward_list, ...) 或 boost::heap 或其他,那也很好。然而,实现目标似乎太难了。
【问题讨论】:
-
目标是什么?在哪些情况下向量、集合和映射可以互换?
-
您可以创建类型特征并为每个类似 xxx 的类型设置一个函数特化。
-
这可以通过专业化和类型特征来完成,但看起来你在重新发明轮子,因为标准算法提供了很多功能和通用接口
-
@larsmans:现在我正在为图形实现邻接列表。用于存储边缘邻居的第二个容器可以是我项目中的向量或集合或地图。
-
insert() 的重载适用于任何事情,也许可以使用它。
标签: c++ templates c++11 containers