मुझे कभी-कभी सामान्य दिनचर्या लिखने की आवश्यकता होती है जिसे वस्तुओं के कंटेनर पर लागू किया जा सकता है, या ऐसे कंटेनरों का मानचित्र (यानी मानचित्र में प्रत्येक कंटेनर को संसाधित करता है)। एक दृष्टिकोण नक्शा प्रकार के लिए अलग दिनचर्या लिखने के लिए है, लेकिन मुझे लगता है कि यह एक नियमित है कि इनपुट के दोनों प्रकार के लिए काम करता है के लिए और अधिक प्राकृतिक और कम शब्दाडंबरपूर्ण हो सकता है:जांचना कि कोई प्रकार नक्शा है
template <typename T>
auto foo(const T& items)
{
return foo(items, /* tag dispatch to map or non-map */);
}
क्या करने के लिए एक सुरक्षित, स्वच्छ रास्ता है यह टैग प्रेषण?
#include <type_traits>
#include <utility>
namespace detail
{
template <typename T, typename = void>
struct IsMap : std::false_type {};
template <typename T>
struct IsMap<T, std::enable_if_t<
std::is_same<typename T::value_type,
std::pair<const typename T::key_type,
typename T::mapped_type>
>::value>
> : std::true_type {};
}
template <typename T>
constexpr bool is_map = detail::IsMap<T>::value;
namespace { template <bool> struct MapTagImpl {}; }
using MapTag = MapTagImpl<true>;
using NonMapTag = MapTagImpl<false>;
template <typename T>
using MapTagType = MapTagImpl<is_map<T>>;
जांचें कि क्या यह 'key_type' और' mapped_type' प्रकारों को नेस्टेड किया गया है? –