шаблоны — C ++ определяет шаблонный класс

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,
Как мне это сделать?

6

Решение

Частичная специализация, когда вы хотите разрешить любой компаратор, хеш, ключ-равный компаратор и распределитель:

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>>{};
12

Другие решения

Используйте некоторую частичную специализацию шаблона

// 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;
};
3

По вопросам рекламы [email protected]