2308C++概念化

这篇具有很好参考价值的文章主要介绍了2308C++概念化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

可看看下一篇,来破除本篇
原文

//概念化(需要`C++20`)
struct 可画 {
  void(小出流 &out) const {
    te::call([](auto const &s, auto &out)
      -> decltype(s.(out)) { s.(out); }, *this, out);
  }
};
struct 方形 {
  void(小出流 &out) const { out << "方形"; }
};
template<te::概念化<可画> T>
void(T const &可画) { 
  可画.(cout);
}
int main() {
  auto 可画 = 方形{};(可画);  //打印方形
}

编译期绑定的过程

首先是利用有状态的模板元绑定鸭子类型与接口.

struct 可画 {
  void(小出流 &out) const {
    te::call([](auto const &s, auto &out)
      -> decltype(s.(out)) { s.(out); }, *this, out);
  }
};

表面是分发给自己实现的函数;但里层却被te库传递给te::callλ式的类型,绑定了可画型.
接着分析te::call的里层实现:

template <...>
constexpr auto call(const TExpr expr, const I &interface, Ts &&... args)
{
  ...
  return detail::call_impl<I>(...);
}//转发

template <...>
constexpr auto call_impl(...)
{
  void(类 映射<I, N>::元 set<型列<TExpr, Ts...> >{});
  return ...;
}

代码非常简单,展开实例化,绑定了映射te::call传递的λ型.
绑定是靠友元注入:

template <class, size_t>
struct 映射 final {
  friend auto get(映射);
  template <class T>
  struct set {
    friend auto get(映射) { return T{}; }
  };
};

实例化映射元后,get友元函数会有个声明式,此时无法确定auto返回值的类型.试实例化映射元结果的set内嵌元时,有get友元函数的定义式,此时按T绑定auto返回值的类型.

就可简单地根据能否推导出get返回值类型来决定绑定结果.以可画的示例,绑定结果如下:

映射<可画, 1>::set<型列<λ型, 小出流&>>

概念化的过程

概念化的过程.遍历所有编译期绑定结果,每个绑定都记录了鸭子类型λ类型及调用形参组成的型列.
然后测试每一个绑定的λ型,看看是否可正确实例化λ类型结果的元调用符.实现代码如下:

template <class T, class TExpr, class... Ts>
constexpr auto requires_impl(型列<TExpr, Ts...>)
    -> decltype(&TExpr::template operator()<T, Ts...>);
template <class I, class T, size_t... Ns>
constexpr auto requires_impl(index_sequence<Ns...>) -> 型列<
    decltype(requires_impl<I>(decltype(get(映射<T, Ns + 1>{})){}))...>;
}  //名字空间细节
template <class I, class T>
concept bool 概念化 = requires {
  detail::requires_impl<I, T>(
      make_index_sequence<detail::映射大小<T, I>()>{});
};

可画鸭子类型与方形实现类型的约束检查过程如下:
首先方形对象传入了方法,会实例化te::conceptfiy并检查是否满足约束:

struct 方形 {
  void(小出流 &out) const { out << "方形"; }
};
template<te::概念化<可画> T>
void(T const &可画) { 
  可画.(cout);
}(方形{});

检查约束是否满足时,会遍历可画绑定的所有接口.这里只绑定了函数,所以只会遍历一个绑定结果:

auto λ = [](auto const &s, auto &out)
      -> decltype(s.(out)) { s.(out); };
using λ型 = decltype(λ);
型列<λ型, 小出流&>;

此时试实例化并推导&λ型::元 符号()<小出流&>的类型,如果成功则满足约束.注意,该λ的能否成功推导关键在,λ函数体后置返回值式的推导结果:

[](auto const &s, auto &out)
//关键点:尾返回类型
-> decltype(s.(out))
//关键点:尾返回类型
{ s.(out); };

此时s的类型推到为方形 const&,如果方形类型没有实现方法,返回值推导无法,整个λ式的推导触发会SFINAE机制,导致实例化失败.
最后输出编译器错误是不满足概念化的约束,非常优雅!文章来源地址https://www.toymoban.com/news/detail-627867.html

到了这里,关于2308C++概念化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Alpaca-cpp(羊驼-cpp): 可以本地运行的 Alpaca 大语言模型

    Stanford Alpaca (羊驼):ChatGPT 学术版开源实现 Alpaca-Lora (羊驼-Lora): 轻量级 ChatGPT 的开源实现(对标 Standford Alpaca) I know。这几天介绍了很多 Alpaca,各种羊驼,似乎有些随心所欲、杂乱无章。但实际上,正如《寒战》中梁家辉饰演的李文斌被廉政公署问话时所说:“要在(每一个

    2023年04月24日
    浏览(60)
  • c语言和cpp里面的强制类型转换

    强制类型转换格式如下: (新类型名)变量名 1 int a =1; double b=10.0; b=(double)a; 2.  c++的强制类型转换 dynamic_cast类型 static_cast类型 auto_cast类型 运行识别和强制内存管理 3.宏定义或者“宏替换” #define 标识符 常量 #define pi 3.14  另一种定义常量的方法是使用const const 数据类型。变

    2024年02月02日
    浏览(54)
  • 使用llama.cpp在本地搭建vicuna 13B语言模型

    有人做了windows下的脚本放到github上了,直接运行就可以了。我在本机试了一下13B的模型能运行,但生成速度非常慢,回复一个问题基本上要花5分钟以上的时间。我的机器配置 3900X 32G内存。 https://github.com/mps256/vicuna.ps1

    2024年02月11日
    浏览(56)
  • C++第三方开发库matplotlib-cpp

    Matplotlib-cpp是一个用于在C++中绘制图表的开源库。它提供了与Python的Matplotlib库类似的功能,使得在C++环境下进行数据可视化变得更加便捷。基于Matplotlib-cpp,我们可以使用各种绘图函数和样式选项来创建各种类型的图表,包括折线图、散点图、柱状图等。它与C++的语法和数据

    2024年02月15日
    浏览(45)
  • 开源C++智能语音识别库whisper.cpp开发使用入门

    whisper.cpp是一个C++编写的轻量级开源智能语音识别库,是基于openai的开源python智能语音模型whisper的移植版本,依赖项少,内存占用低,性能更优,方便作为依赖库集成的到应用程序中提供语音识别功能。 以下基于whisper.cpp的源码利用C++ api来开发实例demo演示读取本地音频文件

    2024年02月20日
    浏览(51)
  • 开源大模型框架llama.cpp使用C++ api开发入门

    llama.cpp是一个C++编写的轻量级开源类AIGC大模型框架,可以支持在消费级普通设备上本地部署运行大模型,以及作为依赖库集成的到应用程序中提供类GPT的功能。 以下基于llama.cpp的源码利用C++ api来开发实例demo演示加载本地模型文件并提供GPT文本生成。 CMakeLists.txt main.cpp 注:

    2024年02月03日
    浏览(57)
  • 大语言模型部署:基于llama.cpp在Ubuntu 22.04及CUDA环境中部署Llama-2 7B

    llama.cpp是近期非常流行的一款专注于Llama/Llama-2部署的C/C++工具。本文利用llama.cpp来部署Llama 2 7B大语言模型,所采用的环境为Ubuntu 22.04及NVIDIA CUDA。文中假设Linux的用户目录(一般为/home/username)为当前目录。 NVIDIA官方已经提供在Ubuntu 22.04中安装CUDA的官方文档。本文稍有不同的

    2024年02月06日
    浏览(43)
  • C语言-指针概念

    什么是指针: 地址指向变量单元,打个比方,一个房间的门口挂了一个房间号2008,这个2008就是房间的地址,或者说,2008\\\"指向\\\"该房间.因此,将地址形象化地称为“指针”。意思是通过它能找到以它为地址的内存单元! 类型 * 指针名 所以:指针名可以代表某一个地址,通过

    2023年04月09日
    浏览(33)
  • C语言第一弹---C语言基本概念(上)

    ✨ 个人主页: 熬夜学编程的小林 💗 系列专栏: 【C语言详解】 【数据结构详解】 在我们的日常生活中,⼈和⼈交流使用的是就是语言,但在这个世界上有很多的国家,很多的民族,因此也有很多的语言,如:汉语、英语、日语, 这些语言我们称之为 自然语言 。但是计算

    2024年01月18日
    浏览(39)
  • C语言之算法的概念

    一、算法的基本概念 1.算法是为解决某一特定类型的问题而制定的一个实现过程。 2.特性 (1)有穷性:一个算法必须在执行有穷步之后结束,且每一步都可在有穷内完成,不能无限地执行下去。 (2)确定性:算法的每一个步骤应当是确切定义的,对于每一个过程不能有二义

    2023年04月08日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包