说起模板元编程,估计不少人的第一反应都是充斥着各种递归的奇技淫巧,没错,这次我们就来对模板元这种屠龙之术进行初步窥探,看看能玩出什么花样出来。
小试牛刀
template
struct get_size {
static constexpr std::size_t value = get_size::value + 1;
};
template
struct get_size {
static constexpr std::size_t value = 1;
};
get_size用于获取参数类型列表的类型个数(可以包括重复的类型),因为要用到递归实现,所以很容易推出f(n) = f(n – 1) + 1的结构。不过递归要写终结条件,这里假定最少的参数个数为1,只需要对模板参数类型为1的情况进行特化。如果有一定的基础,上面这段代码是不难理解的。
再来一个
template
struct all_of {
static constexpr bool value = __Cond && all_of::value;
};
template
struct all_of {
static constexpr bool value = __Cond;
};
这个模板可用于判断参数列表的所有bool值是否都为真,若为真则true,反之false;其实和上面的也差不多,没有用到多复杂的递归。
同理,any_of也是类似的。
template
struct any_of {
static constexpr bool value = __Cond || any_of::value;
};
template
struct any_of {
static constexpr bool value = __Cond;
};
上点强度
template
struct is_ascending {
static constexpr bool value = (__first ::value;
};
template
struct is_ascending {
static constexpr bool value = (__first
判断模板参数序列是否是递增的(非严格递增),类似地,还有
template
struct is_strictly_ascending {
static constexpr bool value = (__first ::value;
};
template
struct is_strictly_ascending {
static constexpr bool value = (__first
struct is_descending {
static constexpr bool value = (__first >= __second) && is_descending::value;
};
template
struct is_descending {
static constexpr bool value = (__first >= __second);
};
template
struct is_strictly_descending {
static constexpr bool value = (__first > __second) && 服务器托管网
is_strictly_descending::value;
};
template
struct is_strictly_descending {
static constexpr bool value = (__first > __second);
};
进阶
std::tuple和std::variant都是C++当中接受可变模板参数的容器。试想一下如何实现这种操作:std::tuple, std::tuple,合并之后变成了std::tuple。
template
struct tuple_type_cat
{};
如果出现了诸如此类的声明,会发现编译器报错,原因是可变参数必须在后面。那难道就没有办法了吗,其实还是有的,得“套中套”。
template
struct tuple_type_cat;
template
struct tuple_type_cat, std::tuple> {
using type = std::tuple;
};
可以先声明一个可变参数模板的结构体,然后到具体实现的时候,这样就可以使用两个可变模板参数了。可以简单理解为,一个可变模板参数可以展开成两个可变模板参数。这样就可以避开声明的时候使用两个可变模板参数从而出现报错的情况。
std::variant也一样,来编写测试看看。
// variant_type_cat
template
struct variant_type_cat;
template
struct variant_type_cat, std::variant> {
using type = std::variant;
};
int main()
{
using v1 = std::variant;
using v2 = std::variant;
using v3 = variant_type_cat::type;
using tmp = std::variant;
static_assert(std::is_same_v);
}
下次有时间再深剖更多有关模板元的技服务器托管网术。
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
相关推荐: 接收机时间,接收机钟差,接收机时间减去接收机钟差
1.钟差的基本概念:接收机时间,存在误差,比如,我认为我接受到信号的时间是a时,时间我后面pvt算出来我接受到信号的真实时刻其实是b,即算出来钟爱是(a-b),要注意的是我应该让接收机时间尽可服务器托管网能的准,应用时一般控制钟差在0.5ms内。 2.钟差的组…