惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Webroot Blog
Webroot Blog
U
Unit 42
A
About on SuperTechFans
宝玉的分享
宝玉的分享
月光博客
月光博客
C
CERT Recently Published Vulnerability Notes
P
Privacy International News Feed
Microsoft Security Blog
Microsoft Security Blog
G
Google Developers Blog
P
Privacy & Cybersecurity Law Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
S
Securelist
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Spread Privacy
Spread Privacy
L
Lohrmann on Cybersecurity
Apple Machine Learning Research
Apple Machine Learning Research
K
Kaspersky official blog
Hugging Face - Blog
Hugging Face - Blog
B
Blog
I
Intezer
Last Week in AI
Last Week in AI
T
Threat Research - Cisco Blogs
V
V2EX
L
LangChain Blog
AI
AI
G
GRAHAM CLULEY
T
Tor Project blog
人人都是产品经理
人人都是产品经理
D
Docker
WordPress大学
WordPress大学
Google DeepMind News
Google DeepMind News
I
InfoQ
Y
Y Combinator Blog
C
Comments on: Blog
GbyAI
GbyAI
www.infosecurity-magazine.com
www.infosecurity-magazine.com
酷 壳 – CoolShell
酷 壳 – CoolShell
T
Tailwind CSS Blog
aimingoo的专栏
aimingoo的专栏
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
腾讯CDC
N
News and Events Feed by Topic
MyScale Blog
MyScale Blog
H
Help Net Security
Vercel News
Vercel News
T
Tenable Blog
博客园 - 三生石上(FineUI控件)
爱范儿
爱范儿

博客园 - 于光远

泛型编程 分区理论知识整理 SPI协议及驱动开发框架 I2C协议及驱动开发框架 使用qemu 加载linux-6.18.1内核 linux 内核 策略模式 单例模式 Linux性能分析:从监控到优化的完整工具链 C++模板元编程实现序列化与反序列化 引用 bootchart linux 脚本打印时间 接口编程 独立于main运行的程序 类模板继承 std::ostream & operator<< Flash HIDL --HelloWorld
不定参数解析,结合tuple
于光远 · 2022-07-13 · via 博客园 - 于光远
#include <iostream>
#include <tuple>
using namespace std;
template<class... Args>
class student{
public:

    template<typename HEAD>
    void displayParam(const HEAD &head){
        
    }
    void displayParam(){
        
    }
    template<class HEAD, class... TAIL>
    void displayParam(HEAD && head,  TAIL &&... tail){
        cout<<head<<endl;
        displayParam(std::forward<TAIL>(tail)...);
    }

   // template<std::size_t I, class... AArgs>
   // class Parameters;

    // template<std::size_t I, class Head, class... PArgs>
    // class Parameters<I, Head, PArgs...> {
    // public:
    //     using Type = typename Parameters<I - 1, PArgs...>::Type;
    // };

    // template<class Head, class... PArgs>
    // class Parameters<0, Head, PArgs...> {
    // public:
    //     using Type = Head;
    // };

    // template<class Head>
    // class Parameters<0, Head> {
    // public:
    //     using Type = Head;
    // };

    // template<std::size_t I>
    // using ArgType = typename Parameters<I, Args...>::Type;

    //template<typename... Args>
    void init(Args&&...args){
        first = std::make_tuple(args...);
    }

    template<std::size_t I>
    //typename std::decay<ArgType<I>>::type 
    auto
    GetValue(){
        //typename std::decay<ArgType<I>>::type tmp = std::get<I>(first);
        //return tmp;
        return std::get<I>(first);
    }

    template<int I>
    int GetInt(){
        cout<<"+++++++"<<endl;
    }

    int NoTemplate(){
        cout<<" in NoTemplate() "<<endl;
        return 0;
    }

    std::tuple<Args...> first; 
};

//------------------------------------
template<class... Args,std::size_t... I>                            // default
void makeI(student<Args...> &A,std::index_sequence<I...>){

    A.displayParam(A.template GetValue<I>()...);
   // A.displayParam(A.GetValue<I>()...); //compile error
    cout<<"-------"<<endl;
    A.displayParam(1,2,3,4,5);

    A.template GetInt<1>();// 因为GetInt和GetValue 里面有 额外的template。 所以在调用的时候,不能直接通过对象调用,只能通过模板关键字调用

    A.NoTemplate();
}
template
<class... Args> void test(student<Args...> &A){ makeI(A,std::index_sequence_for<Args...>()); } //------------------------------------------- int main(){ student<int ,char,string> A; A.init(1,97,"sss"); test(A);// return 0; }