本篇介绍
本篇继续C 的模版介绍
std::invoke
以一种统一形式调用函数和传递参数:
代码语言:javascript复制void foreach (Iter current, Iter end, Callable op, Args const&... args)
{
while (current != end) {
std::invoke(op,
args...,
*current);
current;
}
}
如果需要返回值, 可以这样操作:
代码语言:javascript复制template<typename Callable, typename... Args>
decltype(auto) call(Callable&& op, Args&&... args)
{
return std::invoke(std::forward<Callable>(op),
std::forward<Args>(args)...);
}
如果遇到了返回值是void就不行了,需要使用条件编译区分下。
std::addressof()
防止有的类重载 & 运算符,用 std::addressof() 可以一定拿到地址。
std::declval()
类型占位符,不需要创建对象, 用在不需要计算的上下文中,比如decltype或sizeof。
代码语言:javascript复制#include <utility>
template<typename T1, typename T2,
typename RT = std::decay_t<decltype(true ? std::declval<T1>()
: std::declval<T2>())>>
RT max (T1 a, T2 b)
{
return b<a?a:b;
}
模版模版参数匹配
对于模版模版参数,c 17之后的版本也支持用一个参数包支持多个参数,不需要匹配每个参数。
代码语言:javascript复制template<typename T1, typename T2,
template<typename... > class Cont>
class Rel { ...
// Cont expects any number of // type parameters
};
Rel<int, double, std::list> rel;