您使用可變參數模板參數,所以我想你可以接受一個C++ 11解決方案。
我建議以下(不是很好),基於模板專業化的解決方案。在計數
採取的主要類型,在std::map<>
,是不是key_t
但key_type
和值的類型不是value_t
但mapped_type
。
#include <map>
template <typename X>
struct with_kt
{
template <typename Y = X>
static constexpr bool getValue (int, typename Y::key_type * = nullptr)
{ return true; }
static constexpr bool getValue (long)
{ return false; }
static constexpr bool value { getValue(0) };
};
template <typename T, bool = with_kt<T>::value>
struct KeyValueTraits;
template <typename T>
struct KeyValueTraits<T, true>
{
using key_t = typename T::key_type;
using value_t = typename T::mapped_type;
};
template <typename T>
struct KeyValueTraits<T, false>
{
using pair_t = decltype(* std::declval<T>());
using key_t = typename std::remove_const<
decltype(std::declval<pair_t>().first)>::type;
using value_t = decltype(std::declval<pair_t>().second);
};
using mil = std::map<int,long>;
int main()
{
static_assert(std::is_same<KeyValueTraits<mil>::key_t,
KeyValueTraits<mil::iterator>::key_t
>::value, "!");
static_assert(std::is_same<KeyValueTraits<mil>::value_t,
KeyValueTraits<mil::iterator>::value_t
>::value, "!!");
static_assert(std::is_same<KeyValueTraits<mil>::key_t,
KeyValueTraits<mil::const_iterator>::key_t
>::value, "!!!");
static_assert(std::is_same<KeyValueTraits<mil>::key_t,
KeyValueTraits<mil::reverse_iterator>::key_t
>::value, "!!!!");
static_assert(std::is_same<KeyValueTraits<mil>::key_t,
KeyValueTraits<mil::const_reverse_iterator>::key_t
>::value, "!!!!!");
}
你不能。不是你無論如何都試圖去做的方式。沒有辦法從迭代器中提取容器類型。您可以嘗試使用'first'和'second'(需要C++ 11)。 –
您試圖解決什麼問題?有一些解決方案適用於任何具有'std :: pair的迭代器作爲值類型。一旦你有迭代錯誤,並不總是有可能獲得有關容器的信息。 –