zoukankan      html  css  js  c++  java
  • 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);
    }
    
    
  • 相关阅读:
    寄存器详解
    Sleep(0)的妙用
    源码分析之Dictionary笔记
    ASP.NET Core框架的本质
    Dictionary实现(收藏的)
    微软的判断一个数是不是质数的算法
    C#性能优化:延迟初始化Lazy
    C#3 分部方法,简单标记一下
    单例下并发的情况下访问私有变量的一个典型问题
    BeforeFieldInit的小叙
  • 原文地址:https://www.cnblogs.com/eat-too-much/p/14316014.html
Copyright © 2011-2022 走看看