C++ 元编程 学习二
简介
C++ 元编程 学习之二
参考资料
C++ 模板元编程实战
code
#include <iostream>
// 编译器分支与多种返回类型 写法1
template <bool Check, std::enable_if_t<Check> * = nullptr>
auto fun(){
    return (int) 0;
}
template <bool Check, std::enable_if_t<!Check> * = nullptr>
auto fun() {
    return (double) 1;
}
template<bool Check>
auto wrap2() {
    return fun<Check>();
}
// 编译期分支与多种返回类型  C++17
template <bool Check>
auto fun_(){
    if constexpr (Check) { // 编译期接收值,然后构建运行期的函数
        return (int) 0;
    }else {
        return (double) 1;
    }
}
// 循环代码实现  使用递归实现
template <size_t Input>
constexpr size_t OnesCount = (Input % 2) + OnesCount<(Input / 2)>;
// 终止递归
template<> constexpr size_t OnesCount<0> = 0;
// 循环代码实现 对于数组求和
template <size_t...Inputs>
constexpr size_t Accumulate = 0;
template<size_t CurInput, size_t ...Inputs>
constexpr size_t Accumulate <CurInput, Inputs...> = CurInput + Accumulate<Inputs...>;
// C++ 17 实现技术
template<size_t... values>
constexpr size_t fun_1(){
    return (0 + ... + values);
}
// 容易实例爆炸
// template <size_t A>
// struct Wrap_{
//     template <size_t ID, typename TDummy = void>
//     struct imp {
//         constexpr static size_t value = ID + imp<ID - 1>::value;
//     };
//     template <typename TDummy>
//     struct imp<0, TDummy> {
//         constexpr static size_t value = 0;
//     };
//     template <size_t ID>
//     constexpr static size_t value = imp<A + ID>::value;
// };
// 不容易实例爆炸的样例  公用了 imp的实现
template <size_t ID>
struct imp {
    constexpr static size_t value = ID + imp<ID - 1>::value;
};
template<>
struct imp<0> {
    constexpr static size_t value = 0;
};
template <size_t A>
struct Wrap_{
    template <size_t ID>
    constexpr static size_t value = imp<A + ID>::value;
};
// 短路逻辑未实现的版本  判断是否全是素数
/*
template <size_t N>
constexpr bool is_odd = ((N % 2) == 1);
template <size_t N>
struct AllOdd_ {
    constexpr static bool is_cur_odd = is_odd<N>;
    constexpr static bool is_pre_odd = AllOdd_<N - 1>::value;
    constexpr static bool value = is_cur_odd && is_pre_odd;
};
template <>
struct AllOdd_<0> {
    constexpr static bool value = is_odd<0>;
};
*/
template <size_t N>
constexpr bool is_odd = ((N % 2) == 1);
template <bool cur, typename TNext>
constexpr static bool AndValue = false;
template <typename TNext>
constexpr static bool AndValue<true, TNext> = TNext::value;
template<size_t N>
struct AllOdd_ {
    constexpr static bool is_cur_odd = is_odd<N>;
    constexpr static bool value = AndValue<is_cur_odd, AllOdd_<N - 1>>;
};
template <>
struct AllOdd_<0> {
    constexpr static bool value = is_odd<0>;
};
// 构建虚函数 通过CRTP
template<typename D>
struct Base{
    template <typename TI>
    void Fun(const TI&input){
        D* ptr = static_cast<D*>(this);
        ptr->Imp(input);
    }
};
struct Derive : public Base<Derive>{
    template <typename TI>
    void Imp(const TI& input){
        std::cout << input << std::endl;
    }
};
// 类的静态函数被声明为虚函数?QU:什么鬼
template <typename D>
struct Base1{
    static void Fun(){
        D::Imp();
    }
};
struct Derive1: public Base1<Derive1>{
    static void Imp(){
        std::cout << "Implementation from derive class11" << std::endl;
    }
};
#include "header1.hh"
using namespace std;
int main() {
    cerr << wrap2<true>() << std::endl;
    cerr << wrap2<false>() << std::endl;
    std::cerr << fun_<true>() << std::endl;
    constexpr size_t res = OnesCount<45>;
    std::cerr << res << std::endl;
    constexpr size_t res1 = Accumulate<1, 2, 3, 4, 5>;
    std::cerr << res1 << std::endl;
    constexpr size_t res2 = fun_1<1,2,3,4,5>();
    std::cerr << res2 << std::endl;
    std::cerr << Wrap_<3>::value<2> << std::endl;
    std::cerr << Wrap_<10>::value<2> << std::endl;
    Derive d;
    d.Fun("Implementation from derive class");
    Derive1::Fun();
}
												
											C++ 元编程 学习二的更多相关文章
- 扩展C#与元编程(二)
		
如果你对Windows Workflow Foundation(WF)一无所知,当看到扩展C#与元编程(一)中由MW编译器生成的FirstLook.mw.cs时,也许这么在想:我KAO,这是C#版的汇 ...
 - C++ 模板元编程 学习笔记
		
https://blog.csdn.net/K346K346/article/details/82748163 https://www.jianshu.com/p/b56d59f77d53 https ...
 - Linux网络编程学习(二) ----- 进程控制(第三章)
		
1.进程和程序 程序是一个可执行文件,而一个进程是一个执行中的程序实例.一个进程对应于一个程序的执行,进程是动态的,程序是静态的,多个进程可以并发执行同一个程序.比如几个用户可以同时运行一个编辑程序, ...
 - 网络编程学习二(IP与端口)
		
InetAddress类 封装计算机的ip地址,没有端口 // 使用getLocalHost方法创建InetAddress对象 InetAddress addr = InetAddress.getLo ...
 - 流畅的python第十九章元编程学习记录
		
在 Python 中,数据的属性和处理数据的方法统称属性(attribute).其实,方法只是可调用的属性.除了这二者之外,我们还可以创建特性(property),在不改变类接口的前提下,使用存取方法 ...
 - 扩展C#与元编程
		
扩展C#与元编程 https://www.cnblogs.com/knat/p/4580393.html https://www.cnblogs.com/knat/p/4584023.html 扩展C ...
 - 多线程编程学习笔记——async和await(二)
		
接上文 多线程编程学习笔记——async和await(一) 三. 对连续的异步任务使用await操作符 本示例学习如何阅读有多个await方法方法时,程序的实际流程是怎么样的,理解await的异步 ...
 - 爬虫概念与编程学习之如何爬取视频网站页面(用HttpClient)(二)
		
先看,前一期博客,理清好思路. 爬虫概念与编程学习之如何爬取网页源代码(一) 不多说,直接上代码. 编写代码 运行 <!DOCTYPE html><html><head& ...
 - Linux学习之socket编程(二)
		
Linux学习之socket编程(二) 1.C/S模型——UDP UDP处理模型 由于UDP不需要维护连接,程序逻辑简单了很多,但是UDP协议是不可靠的,实际上有很多保证通讯可靠性的机制需要在应用层实 ...
 - 学习ASP.NET Core Blazor编程系列二——第一个Blazor应用程序(中)
		
学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 四.创建一个Blazor应用程序 1. 第一种创 ...
 
随机推荐
- 基于Zookeeper实现调度任务选主及心跳检测
			
在微服务架构中使用ZooKeeper实现分布式任务调度选主,并确保Follower节点能实时监控Master状态并及时触发重新选举,可以通过以下方案实现: 一.核心设计原理 1. ZooKeeper特 ...
 - Spring IOC源码解析
			
Spring 框架的启动过程是其核心机制之一,主要涉及 IoC 容器的初始化.Bean 的加载和生命周期管理. 以下是 Spring 启动过程的详细步骤 环境准备 项目结构: <?xml ver ...
 - 36条技巧优化PHP代码(总结)
			
原文:38条技巧优化PHP代码 1.如果一个方法能被静态,那就声明他为静态的,速度可提高1/4; 2.echo的效率高于print,因为echo没有返回值,print返回一个整型; 3.在循环之前设置 ...
 - 【渗透 Tips】解决Edge的IE模式下无法抓包情况
			
问题说明 在日常渗透中往往避免不了站点的环境适配问题,有一些站点只能使用IE模式访问,此时便会想着可能使用内置proxy插件代理至抓包软件即可,事实上这并不能很好解决. 如上图所示,即使挂上了yaki ...
 - 【HUST】网安|操作系统实验|实验三 内存管理
			
文章目录 任务 任务1 Win/Linux编写二维数组遍历程序,理解局部性的原理. 1. 提示 2. 任务代码 3. 结果及说明 任务2 Windows/Linux模拟实现OPT和LRU淘汰算法. 1 ...
 - 浅谈鸿蒙跨平台开发框架ArkUI-X
			
之前写过使用uniapp的跨平台开发鸿蒙项目,今天分享一下开发体验更友好的跨平台开发框架ArkUI-X. ArkUI-X看起来像是鸿蒙官方的框架,在DevEco中就可以安装和使用,而且会ArkUI就可 ...
 - NOIP模拟赛(10.17):语言,色球,斐波,偶数
			
语言 题面: 牛妹正在学习一种新的语言,在这种语言里,单词只有形容词(\(\texttt{A}\)),名词(\(\texttt{N}\))和动词(\(\texttt{V}\))三种词性.但是一个单词可 ...
 - frp增加IP限制
			
核心设计理念 传统frp安全方案的不足 静态配置文件管理白名单IP,修改需要重启服务 分布式环境下多节点配置同步困难 缺乏实时阻断恶意IP的能力 Redis作为动态白名单存储的优势 实时生效:IP规则 ...
 - 在java中动态执行js代码
			
说明 在jdk11就标注了要取消NashornScriptEngineFactory类,在jdk17正式移除,所以在17上得加入pom依赖 <dependency> <groupId ...
 - 初探CAP定理及其不可兼得性
			
一.对CAP定理的理解 CAP定理是分布式系统设计的核心理论.由Eric Brewer在2000年提出,后由Gilbert和Lynch在2002年严格证明.分别是指Consistency一致性,Aav ...