在此之前,先来回顾元编程当中的一个重要概念。
template
struct integral_constant
{
static constexpr _Tp value = __v;
typedef _Tp value_type;
typedef integral_constant type;
constexpr operator value_type() const noexcept { return value; }
#if __cplusplus > 201103L
#define __cpp_lib_integral_constant_callable 201304L
constexpr value_type operator()() const noexcept { return value; }
#endif
};
/// The type used as a compile-time boolean with true value.
using true_type = integral_constant;
/// The type used as a compile-time boolean with false value.
using false_type = integral_constant;
std::true_type和std::false_type其实就是std::integral_constant传入模板特定参数的情形,注意到integral_constant结构体当中的value_type,顾名思义指的是值的类型,对应到std::true_type和std::false_type就是true和false。
先尝试着来写一个对std::vector的判断。
// vector
template
struct is_vector : std::false_type{};
template
struct is_vector> : std::true_type{};
template
bool is_vector_v = is_vector::value;
int main() {
std::vector v1;
std::vector v2;
std::vector> v3;
std::cout q1;
std::queue q2;
std::queue> q3;
std::cout
到这里还比较容易,用上面所讲到的std::true_type对is_vector模板类进行特化。拓展到全体STL容器类型,我们可以往此方向进行延申,对其它STL容器反复操作。
// vector
template
struct is_vector : std::false_type{};
template
struct is_vector> : std::true_type{};
template
bool is_vector_v = is_vector::value;
// queue
template
struct is_queue : std::false_type{};
template
struct is_queue> : std::true_type{};
template
bool is_queue_v = is_queue::value;
// string
template
struct is_string : std::false_type{};
template
struct is_string : std::true_type{};
template
bool is_string_v = is_string::value;
// array
template
struct is_array : std::false_type{};
template
struct is_array> : std::true_type{};
template
bool is_array_v = is_array::value;
// priority_queue
template
struct is_priority_queue : std::false_type{};
template
struct is_priority_queue> : std::true_type{};
template
bool is_priority_queue_v = is_priority_queue::value;
// map
template
struct is_map : std::false_type{};
template
struct is_map> : std::true_type{};
template
bool is_map_v = is_map::value;
// unordered_map
template
struct is_unordered_map : std::false_type{};
template
struct is_unordered_map> : std::true_type{};
template
bool is_unordered_map_v = is_unordered_map::value;
// multimap
template
struct is_multimap : std::false_type{};
template
struct is_multimap> : std::true_type{};
template
bool is_multimap_v = is_multimap::value;
// unordered_multimap
template
struct is_unordered_multimap : std::false_type{};
template
struct is_unordered_multimap> : std::true_type{};
template
bool is_unordered_multimap_v = is_unordered_multimap::value;
// set
template
struct is_set : std::false_type{};
template
struct is_set> : std::true_type{};
template
bool is_set_v = is_set::value;
// unordered_set
template
struct is_unordered_set : std::false_type{};
template
struct is_unordered_set> : std::true_type{};
template
bool is_unordered_set_v = is_unordered_set::value;
// multiset
template
struct is_multiset : std::false_type{};
template
struct is_multiset> : std::true_type{};
template
bool is_multiset_v = is_multiset::value;
// unordered_multiset
template
struct is_unordered_multiset : std::false_type{};
template
struct is_unordered_multiset> : std::true_type{};
template
bool is_unordered_multiset_v = is_unordered_multiset::value;
// list
template
struct is_list : std::false_type{};
template
struct is_list> : std::true_type{};
template
bool is_list_v = is_list::value;
// forward_list
template
struct is_forward_list : std::false_type{};
template
struct is_forward_list> : std::true_type{};
template
bool is_forward_list_v = is_forward_list::value;
// stack
template
struct is_stack : std::false_type{};
template
struct is_stack> : std::true_type{};
template
bool is_stack_v = is_stack::value;
// deque
template
struct is_deque : std::false_type{};
template
struct is_deque> : std::true_type{};
template
bool is_deque_v = is_deque::value;
(可能会有遗漏,我对STL的理解就是上面这些)好,接下来可以定义对STL类型判断的bool变量了。
// STL
template
bool is_stl_v = is_vector_v 服务器托管网 ||
is_array_v ||
is_queue_v ||
is_deque_v ||
is_set_v ||
is_unordered_set_v ||
is_multiset_v ||
is_unordered_multiset_v ||
is_map_v ||
is_unordered_map_v ||
is_multimap_v ||
is_unordered_multimap_v ||
is_stack_v ||
is_string_v ||
is_priority_queue_v ||
is_list_v ||
is_forward_list_v;
接下来测试一下(其实不难理解,就是写起来比较费劲)。
#include
#include
#include
#include
#include
#include
#include
吃饭去了。
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
MAST30027: Modern Applied Statistics Assignment 2, 2022.Due: 11:59pm Sunday September 11thThis assignment is worth 7% of your tota…