SlideShare a Scribd company logo
わんくま同盟茶藝部顧問

episthmh

episteme@cppll.jp

Microsoft MVP for Visual C++ (2004~)


variadic function
お馴染み printf(const char* format, ...)
printf(“I‟m %s, %d years old.”, “Adam”, 20);



variadic macro
#define FL_printf(format,...) 
printf(“%s(%d) “ format, __FILE__, __LINE__, __VA_ARGS__)
FL_printf(“I‟m %s, %d years old.”, “Adam”, 20);



…そして variadic template


Template parameter pack


0個以上の型の並び

template<class ...Ts> struct Tuple {};

Tuple<> t0;
Tuple<int> t1;
Tuple<int,float> t2;
Tuple<0> error;

// Tsは 空
// intひとつの並び
// intとfloatの並び
// エラー:0は型ではない


Function parameter pack


0個以上の値の並び

template<class ...Ts> void f(Ts ...vs);

f();
f(1);
f(2, 1.0);

// vs は空
// vs はintひとつの並び
// vs はintとdoubleの並び
typedef Ts MyList; // error!
Ts var; // error!
auto copy = vs; // error!


sizeof...
size_t items = sizeof...(Ts);
size_t items = sizeof...(vs);



packの展開
template<typename ...Ts>
void f(Ts&& ...vs) {
g(3.14, std::forward<Ts>(vs)...);
}
書式

展開

Ts...
Ts&&...
X<Ts,Y>::z...
X<Ts,Us>...
F(5, vs)...

T1, … , Tn
T1&&, … , Tn&&
X<T1,Y>::z, … , X<Tn,Y>::z
X<T1,U1>, … , X<Tn,Un>
F(5,v1), … , f(5,vn)
template<typename ...Ts>
void f(Ts ...vs) {
g(A<Ts...>::h(vs)...);
g(A<Ts...>::h(vs...));
g(A<Ts>::h(vs)...);
}
f(12, „3‟); すると…

void f(int v1, char v2) {

// g(A<Ts...>::h(vs)...);
g(A<int,char>::h(v1), A<int,char>::h(v2));
// g(A<Ts...>::h(vs...));
g(A<int,char>::h(v1,v2));
// g(A<Ts>::h(vs)...);
g(A<int>::h(v1), A<char>::h(v2));
}


キモは「パターン・マッチング」
template<class T1, class T2>
bool isOneOf(T1&& a, T2&& b) {
return a == b;
}

template<class T1, class T2, class ...Ts>
bool isOneOf(T1&& a, T2&& b, Ts&& ...vs) {
return a == b || isOneOf(a, vs...);
}
assert( isOneOf(1, 2, 3.5, 4, 1, 2) );


キモはやっぱり「パターン・マッチング」

// tuple<T0,T1,T2...> :
// tuple<char,int,const char*> t; get<0>(t) = „A‟; get<1>(t) = 12; …

template<int N, typename ...Ts> struct tuple_data;
template<int N> struct tuple_data<N> {};
template<int N, typename Thead, typename ...Tbody>
struct tuple_data<N, Thead, Tbody...>
: public tuple_data<N + 1, Tbody...> {
Thead value;
};
template<typename ...Ts>
struct tuple : public tuple_data<0, Ts...> {};


キモは「パターン・マッチング」

template<int N, typename Thead, typename ...Tbody>
Thead& get_tuple_data(tuple_data<N, Thead, Tbody...>& t)
{ return t.value; }
template<int N, typename ...Ts>
auto get(tuple<Ts...>& t) -> decltype(get_tuple_data<N>(t))
{ return get_tuple_data<N>(t); }
/* おためし */
int main() {
tuple<char,int,const char*> t;
get<0>(t) = 'T'; get<1>(t) = 4; get<2>(t) = "two";
}

More Related Content

Viewers also liked (6)

T69 episteme
T69 epistemeT69 episteme
T69 episteme
 
T45 episteme
T45 epistemeT45 episteme
T45 episteme
 
Episteme unique_ptr
Episteme unique_ptrEpisteme unique_ptr
Episteme unique_ptr
 
ぱっと見でわかるC++11
ぱっと見でわかるC++11ぱっと見でわかるC++11
ぱっと見でわかるC++11
 
Yokohama6 epi
Yokohama6 epiYokohama6 epi
Yokohama6 epi
 
20160219 devsumi cookpad matsuo
20160219 devsumi cookpad matsuo20160219 devsumi cookpad matsuo
20160219 devsumi cookpad matsuo
 

Similar to Episteme variadic template

TypeScript 1.0 オーバービュー
TypeScript 1.0 オーバービューTypeScript 1.0 オーバービュー
TypeScript 1.0 オーバービュー
Akira Inoue
 
プログラマ講習第2回
プログラマ講習第2回プログラマ講習第2回
プログラマ講習第2回
Yuma Yoshimoto
 
プログラマ講習第3回
プログラマ講習第3回プログラマ講習第3回
プログラマ講習第3回
Yuma Yoshimoto
 
C++11概要 ライブラリ編
C++11概要 ライブラリ編C++11概要 ライブラリ編
C++11概要 ライブラリ編
egtra
 
[CB16] (P)FACE :アップルのコアへ、そしてルート権限へのエクスプロイト by Moony Li & Jack Tang
[CB16] (P)FACE :アップルのコアへ、そしてルート権限へのエクスプロイト by Moony Li & Jack Tang[CB16] (P)FACE :アップルのコアへ、そしてルート権限へのエクスプロイト by Moony Li & Jack Tang
[CB16] (P)FACE :アップルのコアへ、そしてルート権限へのエクスプロイト by Moony Li & Jack Tang
CODE BLUE
 
知って得するC#
知って得するC#知って得するC#
知って得するC#
Shota Baba
 
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
kikairoya
 

Similar to Episteme variadic template (20)

templateとautoの型推論
templateとautoの型推論templateとautoの型推論
templateとautoの型推論
 
Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
 
What is template
What is templateWhat is template
What is template
 
TypeScript 1.0 オーバービュー
TypeScript 1.0 オーバービューTypeScript 1.0 オーバービュー
TypeScript 1.0 オーバービュー
 
プログラムの処方箋~健康なコードと病んだコード
プログラムの処方箋~健康なコードと病んだコードプログラムの処方箋~健康なコードと病んだコード
プログラムの処方箋~健康なコードと病んだコード
 
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第4回 ‟関数„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第4回 ‟関数„【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第4回 ‟関数„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第4回 ‟関数„
 
プログラマ講習第2回
プログラマ講習第2回プログラマ講習第2回
プログラマ講習第2回
 
Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11
 
プログラマ講習第3回
プログラマ講習第3回プログラマ講習第3回
プログラマ講習第3回
 
Emcjp item21
Emcjp item21Emcjp item21
Emcjp item21
 
やさしく知りたいC言語
やさしく知りたいC言語やさしく知りたいC言語
やさしく知りたいC言語
 
広告配信現場で使うSpark機械学習
広告配信現場で使うSpark機械学習広告配信現場で使うSpark機械学習
広告配信現場で使うSpark機械学習
 
C++ tips 3 カンマ演算子編
C++ tips 3 カンマ演算子編C++ tips 3 カンマ演算子編
C++ tips 3 カンマ演算子編
 
秀スクリプトの話
秀スクリプトの話秀スクリプトの話
秀スクリプトの話
 
C++11概要 ライブラリ編
C++11概要 ライブラリ編C++11概要 ライブラリ編
C++11概要 ライブラリ編
 
[CB16] (P)FACE :アップルのコアへ、そしてルート権限へのエクスプロイト by Moony Li & Jack Tang
[CB16] (P)FACE :アップルのコアへ、そしてルート権限へのエクスプロイト by Moony Li & Jack Tang[CB16] (P)FACE :アップルのコアへ、そしてルート権限へのエクスプロイト by Moony Li & Jack Tang
[CB16] (P)FACE :アップルのコアへ、そしてルート権限へのエクスプロイト by Moony Li & Jack Tang
 
講座C入門
講座C入門講座C入門
講座C入門
 
Flutterを体験してみませんか
Flutterを体験してみませんかFlutterを体験してみませんか
Flutterを体験してみませんか
 
知って得するC#
知って得するC#知って得するC#
知って得するC#
 
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
 

Recently uploaded

2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
ssuserbefd24
 

Recently uploaded (10)

2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
 
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
 
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
 
【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow
 
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
 
20240523_IoTLT_vol111_kitazaki_v1___.pdf
20240523_IoTLT_vol111_kitazaki_v1___.pdf20240523_IoTLT_vol111_kitazaki_v1___.pdf
20240523_IoTLT_vol111_kitazaki_v1___.pdf
 
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
 
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
 
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
 

Episteme variadic template