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

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

Recently uploaded (7)

2024年5月17日 先駆的科学計算フォーラム2024 機械学習を用いた新たなゲーム体験の創出の応用
2024年5月17日 先駆的科学計算フォーラム2024 機械学習を用いた新たなゲーム体験の創出の応用2024年5月17日 先駆的科学計算フォーラム2024 機械学習を用いた新たなゲーム体験の創出の応用
2024年5月17日 先駆的科学計算フォーラム2024 機械学習を用いた新たなゲーム体験の創出の応用
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介
Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介
Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
LoRaWAN無位置ロープ型水漏れセンサー WL03A-LB/LSカタログ ファイル
LoRaWAN無位置ロープ型水漏れセンサー WL03A-LB/LSカタログ ファイルLoRaWAN無位置ロープ型水漏れセンサー WL03A-LB/LSカタログ ファイル
LoRaWAN無位置ロープ型水漏れセンサー WL03A-LB/LSカタログ ファイル
 
LoRaWAN無位置ロープ式水漏れセンサーWL03A 日本語マニュアル
LoRaWAN無位置ロープ式水漏れセンサーWL03A 日本語マニュアルLoRaWAN無位置ロープ式水漏れセンサーWL03A 日本語マニュアル
LoRaWAN無位置ロープ式水漏れセンサーWL03A 日本語マニュアル
 
ネットワーク可視化 振る舞い検知(NDR)ご紹介_キンドリル202405.pdf
ネットワーク可視化 振る舞い検知(NDR)ご紹介_キンドリル202405.pdfネットワーク可視化 振る舞い検知(NDR)ご紹介_キンドリル202405.pdf
ネットワーク可視化 振る舞い検知(NDR)ご紹介_キンドリル202405.pdf
 

Episteme variadic template