#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;
}
![]()