c++模版笔记(3)

2022-10-25 16:52:42 浏览数 (2)

本篇介绍

本篇继续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;

0 人点赞