前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >c++模版笔记(3)

c++模版笔记(3)

作者头像
一只小虾米
发布2022-10-25 16:52:42
3420
发布2022-10-25 16:52:42
举报
文章被收录于专栏:Android点滴分享

本篇介绍

本篇继续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;
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-10-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 本篇介绍
    • std::invoke
      • std::addressof()
        • std::declval()
          • 模版模版参数匹配
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档