値の型がペアであるイテレータに対して特殊なテンプレート関数を記述したいと思います。私はこれがstd :: mapのイテレータと一致するはずです。ペアを検出するためにイテレータの値の型がペアであるかどうかを確認するenable_if
:
template <typename>
struct is_pair : std::false_type
{ };
template <typename T, typename U>
struct is_pair<std::pair<T, U>> : std::true_type
{ };
// also tried this, but it didn't help
template <typename T, typename U>
struct is_pair<std::pair<const T, U>> : std::true_type
{ };
それから私は、関数の宣言にenable_if使用:
template<class ITR>
decltype(auto) do_stuff(
std::enable_if<is_pair<typename ITR::value_type>::value, ITR> itr) {
//access of itr->second ok.
}
私はマップイテレータで、この機能を使用する場合しかし、私は次のエラーを取得しますclang(Xcode 8.3)のメッセージ:
候補テンプレートが無視されました: 'enable_if'と '__map_iterat'が一致しませんでしたまたは '
これ以上の理由はありません。
__map_iteratorのタイプを調べると、is_pair checkと一致するように見えます。
私は*(DEREF後)マップイテレータがペアに*参照*だけでなく、値型であると思います*。このフライを作るためにリファレンスを取り除かなければならないことは間違いないでしょう。 – WhozCraig