さまざまな STL コンテナーに関数を特化したいことがよくあります。ただし、std::vector や std::deque など、必要なインターフェイスのほとんどを共有しているものもあるため、1 つずつ特殊化する必要はありません。
私のユースケースでは、主に 3 つのカテゴリ (ベクターのようなもの、セットのようなもの、マップのようなもの) があります。たとえば、次のようなものを実装したい
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などに拡張できるとよいでしょう。しかし、目標を達成するのは難しすぎるようです。