gpt4 book ai didi

C++检测模板类

转载 作者:可可西里 更新时间:2023-11-01 18:16:17 26 4
gpt4 key购买 nike

template<typename T>
struct check
{
static const bool value = false;
};

我想做的是拥有check<T>::value当且仅当 T 为真是 std::map<A,B>std::unordered_map<A,B>和两个ABstd::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::mapstd::unordered_map任何键/值组合(和比较器/哈希器/等),你可以完全通用,如取自 here :

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

关于C++检测模板类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12919310/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com