あなたは
template<class StringType, typename type1, typename type2,
template<class, class> class MapType>
void readDatastructure(MapType<type1, type2> map, const StringType path);
の線に沿って何かをしたい。しかし、これは(コンパレータとアロケータのための)2つの追加テンプレートパラメータを有し、std::map
、たとえば、動作しません。だから、どちらか
template<class StringType, typename type1, typename type2,
template<class...> class MapType>
void readDatastructure(MapType<type1, type2> map, const StringType path);
を行うか、すなわち、
template<class StringType, typename type1, typename type2, class C, class A,
template<class, class, class, class> class MapType>
void readDatastructure(MapType<type1, type2, C, A> map, const StringType path);
最初はまだデフォルト以外のコンパレータ/アロケータを取っstd::map
では動作しません、余分なテンプレートパラメータを追加する必要があります。マップに4つのテンプレートタイプのパラメータが正確にない場合、2番目のテンプレートは機能しません。 unordered_map
、これは5つあります。
したがって、地図タイプでこれらのタイプを公開する方が良いでしょう。 std::map
は、例えば、key_type
とmapped_type
と公開しています。 "publish"とはメンバーtypedefとして定義することです。そして、あなたは
template<class StringType, class MapType>
void readDatastructure(MapType map, const StringType path);
を書くことができるとtype1
の代わりに、例えばtypename MapType::key_type
を使用しています。あなたのマップタイプを変更することはできません、と彼らは標準的なプロトコルに従わない場合は
、あなたは特性クラスを記述することができ、あなたのマップタイプのためにそれを特化:次にあなたがtypename map_traits<MapType>::key_type
を使用することができます
template<class T>
struct map_traits {
using key_type = typename T::key_type;
using mapped_type = typename T::mapped_type;
};
template<class T1, class T2>
struct map_traits<MyBrokenMap<T1, T2>> {
using key_type = T1;
using mapped_type = T2;
};
など
*いくつかの点で私は、静的 'type1'と' type2'であるかの種類をチェックしたい*のことを詳しく説明してください。 –
私は 'std :: is_type'を使って、プログラムの中で私のコードの制御フローを決定したいと思っていました。 – XapaJIaMnu