template<typename T>
struct check
{
static const bool value = false;
};
私がやりたいのは、がaまたは両方であり、check<T>::value
である場合にのみ真であるということです。したがって、基本的には、型のコンパイル時チェックを有効にします。どうすればよいですか?T
std::map<A,B>
std::unordered_map<A,B>
A
B
std::string
check
T
template<typename T>
struct check
{
static const bool value = false;
};
私がやりたいのは、がaまたは両方であり、check<T>::value
である場合にのみ真であるということです。したがって、基本的には、型のコンパイル時チェックを有効にします。どうすればよいですか?T
std::map<A,B>
std::unordered_map<A,B>
A
B
std::string
check
T
コンパレータ、ハッシャー、key-equal-comparator、およびallocatorを許可する場合の部分的な特殊化:
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;
};