经常,我想为不同的 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;
};
我认为这似乎是不可能的,但我希望这种情况有某种破解方法。如果它可以扩展到列表类型(std::list, std::forward_list, ...) 或 boost::heap 或其他,那也很好。然而,实现目标似乎太难了。