template<typename T>
struct check
{
static const bool value = false;
};
То, что я хочу сделать, это иметь check<T>::value
быть правдой, если и только если T
это std::map<A,B>
или же std::unordered_map<A,B>
и оба A
а также B
быть std::string
, Так в основном check
позволяет проверять тип во время компиляции T
,
Как мне это сделать?
Частичная специализация, когда вы хотите разрешить любой компаратор, хеш, ключ-равный компаратор и распределитель:
template<class Comp, class Alloc>
struct check<std::map<std::string, std::string, Comp, Alloc>>{
static const bool value = true;
};
template<class Hash, class KeyEq, class Alloc>
struct check<std::unordered_map<std::string, std::string, Hash, KeyEq, Alloc>>{
static const bool value = true;
};
Если вы хотите проверить, если T
использовала версию этих типов по умолчанию (только map<A,B>
и не map<A,B,my_comp>
Вы можете опустить аргументы шаблона и перейти к явной специализации:
template<>
struct check<std::map<std::string, std::string>>{
static const bool value = true;
};
template<>
struct check<std::unordered_map<std::string, std::string>>{
static const bool value = true;
};
И если вы хотите вообще проверить, если это std::map
или же std::unordered_map
любой комбинации ключ / значение (и компаратор / хэш / и т. д.), вы можете использовать полностью общий вид, взятый из Вот:
#include <type_traits>
template < template <typename...> class Template, typename T >
struct is_specialization_of : std::false_type {};
template < template <typename...> class Template, typename... Args >
struct is_specialization_of< Template, Template<Args...> > : std::true_type {};
template<class A, class B>
struct or_ : std::integral_constant<bool, A::value || B::value>{};
template<class T>
struct check
: or_<is_specialization_of<std::map, T>,
is_specialization_of<std::unordered_map, T>>{};
Используйте некоторую частичную специализацию шаблона
// no type passes the check
template< typename T >
struct check
{
static const bool value = false;
};
// unless is a map
template< typename Compare, typename Allocator >
struct check< std::map< std::string, std::string, Compare, Allocator > >
{
static const bool value = true;
};
// or an unordered map
template< typename Hash, typename KeyEqual, typename Allocator >
struct check< std::unordered_map< std::string, std::string, Hash, KeyEqual, Allocator > >
{
static const bool value = true;
};