美文网首页
c++模版笔记(3)

c++模版笔记(3)

作者: android小奉先 | 来源:发表于2022-10-05 18:39 被阅读0次

    本篇介绍

    本篇继续C++的模版介绍

    std::invoke

    以一种统一形式调用函数和传递参数:

    void foreach (Iter current, Iter end, Callable op, Args const&... args)
    {
         while (current != end) {
          std::invoke(op,
                      args...,
                      *current);
           ++current; 
         }
    }
    

    如果需要返回值, 可以这样操作:

    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。

    #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之后的版本也支持用一个参数包支持多个参数,不需要匹配每个参数。

    template<typename T1, typename T2,
             template<typename... > class Cont>
    class Rel { ...
    // Cont expects any number of // type parameters
    };
    Rel<int, double, std::list> rel;
    

    相关文章

      网友评论

          本文标题:c++模版笔记(3)

          本文链接:https://www.haomeiwen.com/subject/evsqortx.html