简介

参考书籍

C++模板元编程实战 -- 李伟

感觉这本书很超值,因为 zsvh 知乎大佬都给写题序了

简单code

header

#include <iostream>
// 顺序结构
template <typename T>
struct RemoveReferenceConst_ {
private:
using inter_type = typename std::remove_reference<T>::type;
public:
using type = typename std::remove_const<inter_type>::type;
}; template <typename T>
using RemoveReferenceConst = typename RemoveReferenceConst_<T>::type; // 分支结构
namespace tt{
template <bool B, typename T, typename F>
struct conditional {
using type = T;
}; template <typename T, typename F>
struct conditional<false, T, F>{
using type = F;
}; template <bool B, typename T, typename F>
using conditional_t = typename conditional<B, T, F>::type;
} // 分支结构2 部分特化
struct A; struct B;
template <typename T>
struct Fun_ {
constexpr static size_t value = 0;
}; template<>
struct Fun_<A> {
constexpr static size_t value = 1;
}; template<>
struct Fun_<B> {
constexpr static size_t value = 2;
}; // 分支结构3 部分特化简化版本 C++14
template<typename T>
constexpr size_t Fun = 0; template<>
constexpr size_t Fun<A> = 1; template<>
constexpr size_t Fun<B> = 2; /**
* @description: 完全特例化 转为 部分特例化
* @param {*}
* @return {*}
*/
/*
* template <typename TW>
* struct Wrapper {
* template <typename T>
* struct Fun_ {
* constexpr static size_t value = 0;
* };
* template <>
* struct Fun_<int> {
* constexpr static size_t value = 1;
* };
* };
*
*/ struct Wrapper {
template <typename T, typename TDummy = void>
struct Fun_ {
constexpr static size_t value = 0;
};
template <typename TDummy>
struct Fun_<int, TDummy> {
constexpr static size_t value = 1;
};
}; // 分支结构实现结构3 利用这个结构实现同名函数返回值不同的操作
namespace ss{
template <bool B, typename T = void>
struct enable_if {}; template <class T>
struct enable_if<true, T> {using type = T; }; template <bool B, class T = void>
using enable_if_t = typename enable_if<B, T>::type;
} template <bool IsFeedbackOut, typename T, ss::enable_if<IsFeedbackOut>* = nullptr>
auto FeedbackOut_(T&&){
return 1;
}
template <bool IsFeedbackOut, typename T, ss::enable_if_t<!IsFeedbackOut>* = nullptr>
auto FeedbackOut_(T&&) {
return 2.0f;
}
#include "header.hh"
using namespace std;
int main(){
RemoveReferenceConst<const int&> h = 3;
cout << h << endl;
tt::conditional<true, int, float>::type x = 3; // 不能用std 因为会和库里面的std冲突
tt::conditional_t<false, int, float> y = 1.0f;
cout << x << endl;
cout << y << endl;
constexpr size_t h1 = Fun_<B>::value;
cout << h1 << endl; constexpr size_t h2 = Fun<B>;
cout << h2 << endl; FeedbackOut_<true, int>(2);
}

C++ 元函数的学习一的更多相关文章

  1. STL学习小结

    STL就是Standard Template Library,标准模板库.这可能是一个历史上最令人兴奋的工具的最无聊的术语.从根本上说,STL是一些"容器"的集合,这些" ...

  2. 学习STL-介绍一下STL

    从大学时就开始学习C++,到现在近5年的时间了却很少用到STL.现在想想真得是对不起这门语言,也对不起宝贵的五年光阴.我钟爱C++,所以一定要完全搞懂它,理解它.爱一个人的前提是要懂他(她),爱一门语 ...

  3. ###STL学习--适配器

    点击查看Evernote原文. #@author: gr #@date: 2014-08-24 #@email: forgerui@gmail.com STL中的适配器. ###stl学习 |--迭代 ...

  4. STL学习总结

    STL就是Standard Template Library,标准模板库.这可能是一个历史上最令人兴奋的工具的最无聊的术语.从根本上说,STL是一些"容器"的集合.这些" ...

  5. 【Unity Shader】二、顶点函数(vertex)和片元函数(fragment)传递数据,及各阶段可使用的语义(semantic)

    学习资料:http://www.sikiedu.com/course/37/task/433/show 本节学习目标: 学习Shader中结构体struct的使用. 学习在片元函数(vertex)和顶 ...

  6. 【Unity Shader】一、顶点函数(vertex)和片元函数(fragment)

    学习资料:http://www.sikiedu.com/course/37/task/430/show 学习Shader中顶点函数(vertex)和片元函数(fragment)的基本用法. Shade ...

  7. Shader学习笔记

    Shader学习笔记 例子: Shader "SrfShader1"{ //定义显示在Inspector中的变量,并从Inspector中获取值 Properties{ _Colo ...

  8. 【笔记】MAML-模型无关元学习算法

    目录 论文信息: Finn C, Abbeel P, Levine S. Model-agnostic meta-learning for fast adaptation of deep networ ...

  9. 深度学习面试题03:改进版梯度下降法Adagrad、RMSprop、Momentum、Adam

    目录 Adagrad法 RMSprop法 Momentum法 Adam法 参考资料 发展历史 标准梯度下降法的缺陷 如果学习率选的不恰当会出现以上情况 因此有一些自动调学习率的方法.一般来说,随着迭代 ...

  10. 特征工程学习01-sklearn单机特征工程

    特征工程学习01-sklearn单机特征工程 小书匠 kindle  0.数据的导入 from sklearn.datasets import load_iris  #导入IRIS数据集  iris= ...

随机推荐

  1. iOS深色模式媒体查询css

    @media (prefers-color-scheme: dark) { body { background-color: #000; color: #fff; } }

  2. Vue横向滚动鼠标控制

    let level_cards // 标记可移动 , move_start // 移动初始的x位置 , move_x // 移动初始的容器偏移量 , move_scroll_left // 判断是否为 ...

  3. 太喜欢啦,浏览器中的SQL神器:WhatTheDuck让CSV分析像聊天一样简单!

    嗨,大家好,我是小华同学,关注我们获得"最新.最全.最优质"开源项目和高效工作学习方法 基于DuckDB的轻量级Web应用 | 完全浏览器端运行 | 零数据泄露风险 | 支持复杂S ...

  4. 【笔记】PyVis|神经网络数据集的可视化

    文章目录 版本: 应用实例: PyVis的应用: 零.官方教程 一.初始化画布`Network` 二.添加结点 添加单个结点`add_node`: 添加一系列结点`add_nodes`: 三.添加边 ...

  5. 【笔记】Excel 2021|重要篇|(一)VBA精准控制选择范围、VBA提高运行速度并降低运行时的内存消耗

      最近总是遇到只有Excel表.没有数据库的情况,不太可能让别人搭Python环境来建数据库,但对常用数据库的使用也不太熟悉,也没买服务器不能让别人远程操控.再加上Python操作Excel的效率令 ...

  6. django笔记(3)-数据库操作

    一:路由系统    url    1.url(r'^index/', views.index),url(r'^home/',views.Home.as_view()), 一个url对应一个函数或一个类 ...

  7. 递归神经网络 RNN 原理(下)

    基于对 RNN 的初步认识, 还是先回顾一下它核心的步骤: (1) words / onehot vectors : \(x^{(t)} \in R^{|v|}\) **(2) word embedd ...

  8. Sqlite3中的Join

    1.概述sqlite3是一种轻便的数据库,由DDL(Data defination language),DML(Data manipulation language),TCL(Transaction ...

  9. FFmpeg开发笔记(六十一)Linux给FFmpeg集成H.266编码器vvenc

    ​<FFmpeg开发实战:从零基础到短视频上线>该书的第一章介绍了如何在Linux环境给FFmpeg集成H.264和H.265的编码器,如今H.266的编码器vvenc也日渐成熟,从7.1 ...

  10. Redis实战-缓存穿透、缓存雪崩、缓存击穿和缓存并发的区别和解决方案

    正常处理流程   客户端请求正常的时候,先读缓存,如果数据命中,则返回缓存的值:否则,把从存储层中读取出来的数据缓存至缓存,同时返回客户端.但是,为了保证系统高可用和高性能,设计一个缓存系统时必须考虑 ...