C++ 元函数的学习一
简介
参考书籍
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++ 元函数的学习一的更多相关文章
- STL学习小结
STL就是Standard Template Library,标准模板库.这可能是一个历史上最令人兴奋的工具的最无聊的术语.从根本上说,STL是一些"容器"的集合,这些" ...
- 学习STL-介绍一下STL
从大学时就开始学习C++,到现在近5年的时间了却很少用到STL.现在想想真得是对不起这门语言,也对不起宝贵的五年光阴.我钟爱C++,所以一定要完全搞懂它,理解它.爱一个人的前提是要懂他(她),爱一门语 ...
- ###STL学习--适配器
点击查看Evernote原文. #@author: gr #@date: 2014-08-24 #@email: forgerui@gmail.com STL中的适配器. ###stl学习 |--迭代 ...
- STL学习总结
STL就是Standard Template Library,标准模板库.这可能是一个历史上最令人兴奋的工具的最无聊的术语.从根本上说,STL是一些"容器"的集合.这些" ...
- 【Unity Shader】二、顶点函数(vertex)和片元函数(fragment)传递数据,及各阶段可使用的语义(semantic)
学习资料:http://www.sikiedu.com/course/37/task/433/show 本节学习目标: 学习Shader中结构体struct的使用. 学习在片元函数(vertex)和顶 ...
- 【Unity Shader】一、顶点函数(vertex)和片元函数(fragment)
学习资料:http://www.sikiedu.com/course/37/task/430/show 学习Shader中顶点函数(vertex)和片元函数(fragment)的基本用法. Shade ...
- Shader学习笔记
Shader学习笔记 例子: Shader "SrfShader1"{ //定义显示在Inspector中的变量,并从Inspector中获取值 Properties{ _Colo ...
- 【笔记】MAML-模型无关元学习算法
目录 论文信息: Finn C, Abbeel P, Levine S. Model-agnostic meta-learning for fast adaptation of deep networ ...
- 深度学习面试题03:改进版梯度下降法Adagrad、RMSprop、Momentum、Adam
目录 Adagrad法 RMSprop法 Momentum法 Adam法 参考资料 发展历史 标准梯度下降法的缺陷 如果学习率选的不恰当会出现以上情况 因此有一些自动调学习率的方法.一般来说,随着迭代 ...
- 特征工程学习01-sklearn单机特征工程
特征工程学习01-sklearn单机特征工程 小书匠 kindle 0.数据的导入 from sklearn.datasets import load_iris #导入IRIS数据集 iris= ...
随机推荐
- iOS深色模式媒体查询css
@media (prefers-color-scheme: dark) { body { background-color: #000; color: #fff; } }
- Vue横向滚动鼠标控制
let level_cards // 标记可移动 , move_start // 移动初始的x位置 , move_x // 移动初始的容器偏移量 , move_scroll_left // 判断是否为 ...
- 太喜欢啦,浏览器中的SQL神器:WhatTheDuck让CSV分析像聊天一样简单!
嗨,大家好,我是小华同学,关注我们获得"最新.最全.最优质"开源项目和高效工作学习方法 基于DuckDB的轻量级Web应用 | 完全浏览器端运行 | 零数据泄露风险 | 支持复杂S ...
- 【笔记】PyVis|神经网络数据集的可视化
文章目录 版本: 应用实例: PyVis的应用: 零.官方教程 一.初始化画布`Network` 二.添加结点 添加单个结点`add_node`: 添加一系列结点`add_nodes`: 三.添加边 ...
- 【笔记】Excel 2021|重要篇|(一)VBA精准控制选择范围、VBA提高运行速度并降低运行时的内存消耗
最近总是遇到只有Excel表.没有数据库的情况,不太可能让别人搭Python环境来建数据库,但对常用数据库的使用也不太熟悉,也没买服务器不能让别人远程操控.再加上Python操作Excel的效率令 ...
- django笔记(3)-数据库操作
一:路由系统 url 1.url(r'^index/', views.index),url(r'^home/',views.Home.as_view()), 一个url对应一个函数或一个类 ...
- 递归神经网络 RNN 原理(下)
基于对 RNN 的初步认识, 还是先回顾一下它核心的步骤: (1) words / onehot vectors : \(x^{(t)} \in R^{|v|}\) **(2) word embedd ...
- Sqlite3中的Join
1.概述sqlite3是一种轻便的数据库,由DDL(Data defination language),DML(Data manipulation language),TCL(Transaction ...
- FFmpeg开发笔记(六十一)Linux给FFmpeg集成H.266编码器vvenc
<FFmpeg开发实战:从零基础到短视频上线>该书的第一章介绍了如何在Linux环境给FFmpeg集成H.264和H.265的编码器,如今H.266的编码器vvenc也日渐成熟,从7.1 ...
- Redis实战-缓存穿透、缓存雪崩、缓存击穿和缓存并发的区别和解决方案
正常处理流程 客户端请求正常的时候,先读缓存,如果数据命中,则返回缓存的值:否则,把从存储层中读取出来的数据缓存至缓存,同时返回客户端.但是,为了保证系统高可用和高性能,设计一个缓存系统时必须考虑 ...