SlideShare ist ein Scribd-Unternehmen logo
1 von 36
Downloaden Sie, um offline zu lesen
C++ For Researchers
研究生のためのC++
企画・立案 難波知宏
テンプレート
第四回
2
関数テンプレート
第一節
3
関数テンプレートとは
4
Sample 4-1
5
そうだ、max関数を作ろう
sample 4-1-1
int max(int x, int y) {
return (x > y) ? x : y;
}
6
関数テンプレートとは
Sample 4-1
従来のプログラム
double版も欲しくなった
e ? a : b
 e が true のとき a
false のとき b を返す
sample 4-1-1
int max(int x, int y) {
return (x > y) ? x : y;
}
double max(double x, double y) {
return (x > y) ? x : y;
}
7
関数テンプレートとは
Sample 4-1
従来のプログラム
データ型が違うだけで
同じ処理なのに、
別々に記述
何とかして一つに
まとめられないか?
8
テ
ン
プ
レ
ー
ト
で
で
き
ま
す
よ
sample 4-1-2
template <typename Type>
Type max(Type x, Type y)
{
return (x > y) ? x : y;
}
9
関数テンプレートとは
Sample 4-1
テンプレートを使って一つにまとめる
データ型に依存
しない関数
template <…>
を関数の前につけると、
関数テンプレートになる.
テンプレート引数の明示指定
Sample 4-2
10
sample 4-2-1
template <typename Type>
Type max(Type x, Type y)
{
return (x > y) ? x : y;
}
int main()
{
double c = max(7, 3.0); // Compile error!
}
11
テンプレート引数の明示指定
Sample 4-2
次のプログラムはコンパイルエラーになります。
テンプレート引数Typeを
intとdoubleのどちらに
したらいいかわからない!
コンパイラ
sample 4-2-1
template <typename Type>
Type max(Type x, Type y)
{
return (x > y) ? x : y;
}
int main()
{
double c = max<double>(7, 3.0); // OK.
}
12
テンプレート引数の明示指定
Sample 4-2
<…>でテンプレート引数の型を指定すればよい。
実は、テンプレート引数
が省略された場合、
コンパイラが自動で
推論しているんだよね
コンパイラ
関数テンプレートの特殊化
13
Sample 4-3
14
string型でもmax関数が動くようにしたい
15
そんでもって
string型の場合は、長さが大きい方を返したい
sample 4-3-1
#include <string>
template <typename Type>
Type max(Type x, Type y) {
return (x > y) ? x : y;
}
int main()
{
double c = max<double>(7, 3.0); // OK.
char* d = max<char*>("hoge", "hogehoge");// NG (Unexpected result).
}
16
関数テンプレートの特殊化
Sample 4-3
従来のプログラム
期待通りに
ならない
sample 4-3-2
#include <string>
template <typename Type>
Type max(Type x, Type y) {
return (x > y) ? x : y;
}
template <>
char* max(char* x, char* y) {
return (strlen(x) > strlen(y)) ? x : y;
}
int main() {
double c = max<double>(7, 3.0); // OK.
char* d = max<char*>("hoge", "hogehoge"); // OK.
}
17
関数テンプレートの特殊化
Sample 4-3
特殊化をすれば、文字列専用の処理ができる
テンプレート引数がchar*
の場合は、例外的にこの
関数が呼ばれる
クラステンプレート
第二節
18
19
クラスにもテンプレートの概念を適用できます
クラステンプレートとは
20
Sample 4-4
21
そうだ。ベクトルクラスつくろう
sample 4-4-1/Vector3.h
class Vector3
{
public:
Vector3() … { … }
Vector3(float x, float y, float z) … { … }
static float dot(Vector3 a, Vector3 b) { … }
float x, y, z;
};
Vector3 operator +(Vector3 a, Vector3 b) { … }
22
クラステンプレートとは
Sample 4-4
前回作ったベクトルクラス(の一部)
float以外でも使えるようにしたい
sample 4-4-2/Vector3.h
template <typename T>
class Vector3
{
(省略)
T x, y, z;
};
23
クラステンプレートとは
Sample 4-4
テンプレートベクトルクラス
template <…>
をクラス定義の前につけると、
クラステンプレートになる.
データ型に依存
しないクラス
クラステンプレートの特殊化
24
Sample 4-5
25
関数テンプレートと同じように、クラステンプレート
も特殊化ができます(省略)
テンプレートのからくり
第三節
26
テンプレートのからくり
テンプレートの型引数ごとに別個にコードを生成
27
sample 4-6-1
#include <iostream>
template <typename T> void func() {}
int main()
{
printf("<int> -> %p¥n", func<int>);
printf("<double> -> %p¥n", func<double>);
}
実行結果
<int> -> 0095100F
<double> -> 00951014
28
テンプレートのからくり
関数のアドレスを調べればわかる
func<int>が出現した
時点でfunc<int>を
コンパイル時に生成
コンパイラ
まとめ
29
template <typename T>
void f() { /* ... */ }
template <typename T>
class C { /* ... */ };
30
テンプレート
データ型に依存しない関数・クラスを作る仕組み
template <…>
を関数の前につけると
関数テンプレートを定義
template <…>
をクラスの前につけると
クラステンプレートを定義
template <typename T>
void f() { /* ... */ }
template <typename T>
class C { /* ... */ };
int main()
{
f<int>();
C<int> c;
}
31
テンプレート引数の指定
f<…>
C<…>
でテンプレート引数を
明示的に指定
言語比較 <ジェネリック編>
おまけ
32
ジェネリック機能比較
C++ C# Java
実体の生成
タイミング
コンパイル時 実行時
コンパイル時にキャストを挿
入し非ジェネリックに変換、
つまり実体は一つ
パフォーマンス
◎
(実体別に最適化)
○
×
(キャストによるオーバーヘッ
ドが発生)
コンパイル後の
コード共有
×
(プログラムサイズが爆発
する原因)
○
○
(実体は一つしかない)
組み込み型の
ジェネリック引数
○
○
(組み込み型の
ジェネリックはク
ラス型のものと
は別に生成)
×
(クラス型のみ○)
33
このページに詳しく書いてあります
sample 4-7-1/main.cpp
#include <iostream>
template <typename T> class C
{
public:
template <typename U> static void F() {}
};
int main()
{
C<int>::F<double>();
printf("%s¥n", typeid(C<int>).name());
printf("%s¥n", typeid(C<double>).name());
}
実行結果
class C<int>
class C<double>
34
言語比較 <ジェネリック編>
おまけ
C++のジェネリック(テンプレート)
sample 4-7-2/Program.cs
using System;
class C<T>
{
public static void F<U>() { }
}
class Program
{
static void Main(string[] args)
{
C<int>.F<double>();
Console.WriteLine(typeof(C<int>));
Console.WriteLine(typeof(C<float>));
}
}
実行結果
C`1[System.Int32]
C`1[System.Single]
35
言語比較 <ジェネリック編>
おまけ
C#のジェネリック
sample 4-7-3/Program.java
実行結果
class C
class C
36
おまけ
Javaのジェネリック
言語比較 <ジェネリック編>
型情報が抜け落ちてる…

Weitere ähnliche Inhalte

Was ist angesagt?

[第2版]Python機械学習プログラミング 第8章
[第2版]Python機械学習プログラミング 第8章[第2版]Python機械学習プログラミング 第8章
[第2版]Python機械学習プログラミング 第8章Haruki Eguchi
 
Python for Data Anaysis第2回勉強会4,5章
Python for Data Anaysis第2回勉強会4,5章Python for Data Anaysis第2回勉強会4,5章
Python for Data Anaysis第2回勉強会4,5章Makoto Kawano
 
Introduction to NumPy & SciPy
Introduction to NumPy & SciPyIntroduction to NumPy & SciPy
Introduction to NumPy & SciPyShiqiao Du
 
[第2版]Python機械学習プログラミング 第16章
[第2版]Python機械学習プログラミング 第16章[第2版]Python機械学習プログラミング 第16章
[第2版]Python機械学習プログラミング 第16章Haruki Eguchi
 
NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門Shiqiao Du
 
Ekmett勉強会発表資料
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料時響 逢坂
 
Ekmett勉強会発表資料
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料時響 逢坂
 
科学技術計算関連Pythonパッケージの概要
科学技術計算関連Pythonパッケージの概要科学技術計算関連Pythonパッケージの概要
科学技術計算関連Pythonパッケージの概要Toshihiro Kamishima
 
2013.07.15 はじパタlt scikit-learnで始める機械学習
2013.07.15 はじパタlt scikit-learnで始める機械学習2013.07.15 はじパタlt scikit-learnで始める機械学習
2013.07.15 はじパタlt scikit-learnで始める機械学習Motoya Wakiyama
 
関数型プログラミング入門 with OCaml
関数型プログラミング入門 with OCaml関数型プログラミング入門 with OCaml
関数型プログラミング入門 with OCamlHaruka Oikawa
 
Gura プログラミング言語の紹介
Gura プログラミング言語の紹介Gura プログラミング言語の紹介
Gura プログラミング言語の紹介Yutaka Saito
 
マスターオブゴールーチンアンドチャネル スタートGo #1
マスターオブゴールーチンアンドチャネル   スタートGo #1マスターオブゴールーチンアンドチャネル   スタートGo #1
マスターオブゴールーチンアンドチャネル スタートGo #1Takuya Ueda
 
すごいHaskell楽しく学ぼう-第12章モノイド-
すごいHaskell楽しく学ぼう-第12章モノイド-すごいHaskell楽しく学ぼう-第12章モノイド-
すごいHaskell楽しく学ぼう-第12章モノイド-Hiromasa Ohashi
 
VS勉強会 .NET Framework 入門
VS勉強会 .NET Framework 入門VS勉強会 .NET Framework 入門
VS勉強会 .NET Framework 入門kamukiriri
 
for関数を使った繰り返し処理によるヒストグラムの一括出力
for関数を使った繰り返し処理によるヒストグラムの一括出力for関数を使った繰り返し処理によるヒストグラムの一括出力
for関数を使った繰り返し処理によるヒストグラムの一括出力imuyaoti
 
Real World OCamlを読んでLispと協調してみた
Real World OCamlを読んでLispと協調してみたReal World OCamlを読んでLispと協調してみた
Real World OCamlを読んでLispと協調してみたblackenedgold
 
C++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みくださいC++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みくださいdigitalghost
 
すごいH 第12章モノイド
すごいH 第12章モノイドすごいH 第12章モノイド
すごいH 第12章モノイドShinta Hatatani
 
Van laarhoven lens
Van laarhoven lensVan laarhoven lens
Van laarhoven lensNaoki Aoyama
 

Was ist angesagt? (20)

NumPy闇入門
NumPy闇入門NumPy闇入門
NumPy闇入門
 
[第2版]Python機械学習プログラミング 第8章
[第2版]Python機械学習プログラミング 第8章[第2版]Python機械学習プログラミング 第8章
[第2版]Python機械学習プログラミング 第8章
 
Python for Data Anaysis第2回勉強会4,5章
Python for Data Anaysis第2回勉強会4,5章Python for Data Anaysis第2回勉強会4,5章
Python for Data Anaysis第2回勉強会4,5章
 
Introduction to NumPy & SciPy
Introduction to NumPy & SciPyIntroduction to NumPy & SciPy
Introduction to NumPy & SciPy
 
[第2版]Python機械学習プログラミング 第16章
[第2版]Python機械学習プログラミング 第16章[第2版]Python機械学習プログラミング 第16章
[第2版]Python機械学習プログラミング 第16章
 
NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門
 
Ekmett勉強会発表資料
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料
 
Ekmett勉強会発表資料
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料
 
科学技術計算関連Pythonパッケージの概要
科学技術計算関連Pythonパッケージの概要科学技術計算関連Pythonパッケージの概要
科学技術計算関連Pythonパッケージの概要
 
2013.07.15 はじパタlt scikit-learnで始める機械学習
2013.07.15 はじパタlt scikit-learnで始める機械学習2013.07.15 はじパタlt scikit-learnで始める機械学習
2013.07.15 はじパタlt scikit-learnで始める機械学習
 
関数型プログラミング入門 with OCaml
関数型プログラミング入門 with OCaml関数型プログラミング入門 with OCaml
関数型プログラミング入門 with OCaml
 
Gura プログラミング言語の紹介
Gura プログラミング言語の紹介Gura プログラミング言語の紹介
Gura プログラミング言語の紹介
 
マスターオブゴールーチンアンドチャネル スタートGo #1
マスターオブゴールーチンアンドチャネル   スタートGo #1マスターオブゴールーチンアンドチャネル   スタートGo #1
マスターオブゴールーチンアンドチャネル スタートGo #1
 
すごいHaskell楽しく学ぼう-第12章モノイド-
すごいHaskell楽しく学ぼう-第12章モノイド-すごいHaskell楽しく学ぼう-第12章モノイド-
すごいHaskell楽しく学ぼう-第12章モノイド-
 
VS勉強会 .NET Framework 入門
VS勉強会 .NET Framework 入門VS勉強会 .NET Framework 入門
VS勉強会 .NET Framework 入門
 
for関数を使った繰り返し処理によるヒストグラムの一括出力
for関数を使った繰り返し処理によるヒストグラムの一括出力for関数を使った繰り返し処理によるヒストグラムの一括出力
for関数を使った繰り返し処理によるヒストグラムの一括出力
 
Real World OCamlを読んでLispと協調してみた
Real World OCamlを読んでLispと協調してみたReal World OCamlを読んでLispと協調してみた
Real World OCamlを読んでLispと協調してみた
 
C++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みくださいC++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みください
 
すごいH 第12章モノイド
すごいH 第12章モノイドすごいH 第12章モノイド
すごいH 第12章モノイド
 
Van laarhoven lens
Van laarhoven lensVan laarhoven lens
Van laarhoven lens
 

Andere mochten auch (17)

研究生のためのC++ no.7
研究生のためのC++ no.7研究生のためのC++ no.7
研究生のためのC++ no.7
 
Rango celdas autorellenar
Rango celdas autorellenarRango celdas autorellenar
Rango celdas autorellenar
 
Music Distribution Presentation
Music Distribution PresentationMusic Distribution Presentation
Music Distribution Presentation
 
..Festival Der Zeppeline
..Festival Der Zeppeline..Festival Der Zeppeline
..Festival Der Zeppeline
 
E tefl
E teflE tefl
E tefl
 
Reference Pete
Reference PeteReference Pete
Reference Pete
 
Diseño de tablas
Diseño de tablasDiseño de tablas
Diseño de tablas
 
Music Distribution_MVT-SUGO
Music Distribution_MVT-SUGOMusic Distribution_MVT-SUGO
Music Distribution_MVT-SUGO
 
La celebración pedagógica como eje
La celebración pedagógica como ejeLa celebración pedagógica como eje
La celebración pedagógica como eje
 
Taller NTIC
Taller NTICTaller NTIC
Taller NTIC
 
La historia interminable
La historia interminableLa historia interminable
La historia interminable
 
Great ideas in music distribution
Great ideas in music distributionGreat ideas in music distribution
Great ideas in music distribution
 
Yeny andrea Contreras
Yeny andrea ContrerasYeny andrea Contreras
Yeny andrea Contreras
 
Presentation1 incoterms 2010
Presentation1 incoterms 2010Presentation1 incoterms 2010
Presentation1 incoterms 2010
 
Resume_Rajini (1)
Resume_Rajini (1)Resume_Rajini (1)
Resume_Rajini (1)
 
درباره ی بلوبری
درباره ی بلوبریدرباره ی بلوبری
درباره ی بلوبری
 
string , pointer
string , pointerstring , pointer
string , pointer
 

Ähnlich wie 研究生のためのC++ no.4

Lambda in template_final
Lambda in template_finalLambda in template_final
Lambda in template_finalCryolite
 
関数モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第8回】
関数モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第8回】関数モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第8回】
関数モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第8回】Tomoharu ASAMI
 
Pythonで始めるDropboxAPI
Pythonで始めるDropboxAPIPythonで始めるDropboxAPI
Pythonで始めるDropboxAPIDaisuke Igarashi
 
【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」
【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」
【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」fukuoka.ex
 
Nds meetup8 lt
Nds meetup8 ltNds meetup8 lt
Nds meetup8 ltushiboy
 
Learning Template Library Design using Boost.Geomtry
Learning Template Library Design using Boost.GeomtryLearning Template Library Design using Boost.Geomtry
Learning Template Library Design using Boost.GeomtryAkira Takahashi
 
基礎構文班22回目 試験対策もどき
基礎構文班22回目 試験対策もどき基礎構文班22回目 試験対策もどき
基礎構文班22回目 試験対策もどきXMLProJ2014
 
JavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 AutumnJavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 AutumnKoji Ishimoto
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門Hideyuki Tanaka
 
ECMAScript 6 Features(PDF 版)
ECMAScript 6 Features(PDF 版)ECMAScript 6 Features(PDF 版)
ECMAScript 6 Features(PDF 版)taskie
 
JavaScriptクイックスタート
JavaScriptクイックスタートJavaScriptクイックスタート
JavaScriptクイックスタートShumpei Shiraishi
 
[Basic 3] 計算量 / 配列, 連結リスト / ハッシュ テーブル / スタック, キュー
[Basic 3] 計算量 / 配列, 連結リスト / ハッシュ テーブル / スタック, キュー[Basic 3] 計算量 / 配列, 連結リスト / ハッシュ テーブル / スタック, キュー
[Basic 3] 計算量 / 配列, 連結リスト / ハッシュ テーブル / スタック, キューYuto Takei
 
プログラミングHaskell(第2章)
プログラミングHaskell(第2章)プログラミングHaskell(第2章)
プログラミングHaskell(第2章)yaju88
 
Replace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPReplace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPAkira Takahashi
 
JavaScript 講習会 #1
JavaScript 講習会 #1JavaScript 講習会 #1
JavaScript 講習会 #1Susisu
 

Ähnlich wie 研究生のためのC++ no.4 (20)

Lambda in template_final
Lambda in template_finalLambda in template_final
Lambda in template_final
 
What is template
What is templateWhat is template
What is template
 
Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
 
関数モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第8回】
関数モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第8回】関数モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第8回】
関数モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第8回】
 
Pythonで始めるDropboxAPI
Pythonで始めるDropboxAPIPythonで始めるDropboxAPI
Pythonで始めるDropboxAPI
 
【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」
【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」
【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」
 
Nds meetup8 lt
Nds meetup8 ltNds meetup8 lt
Nds meetup8 lt
 
Learning Template Library Design using Boost.Geomtry
Learning Template Library Design using Boost.GeomtryLearning Template Library Design using Boost.Geomtry
Learning Template Library Design using Boost.Geomtry
 
基礎構文班22回目 試験対策もどき
基礎構文班22回目 試験対策もどき基礎構文班22回目 試験対策もどき
基礎構文班22回目 試験対策もどき
 
boost tour 1.48.0 all
boost tour 1.48.0 allboost tour 1.48.0 all
boost tour 1.48.0 all
 
JavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 AutumnJavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 Autumn
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門
 
ECMAScript 6 Features(PDF 版)
ECMAScript 6 Features(PDF 版)ECMAScript 6 Features(PDF 版)
ECMAScript 6 Features(PDF 版)
 
Prosym2012
Prosym2012Prosym2012
Prosym2012
 
フラグを愛でる
フラグを愛でるフラグを愛でる
フラグを愛でる
 
JavaScriptクイックスタート
JavaScriptクイックスタートJavaScriptクイックスタート
JavaScriptクイックスタート
 
[Basic 3] 計算量 / 配列, 連結リスト / ハッシュ テーブル / スタック, キュー
[Basic 3] 計算量 / 配列, 連結リスト / ハッシュ テーブル / スタック, キュー[Basic 3] 計算量 / 配列, 連結リスト / ハッシュ テーブル / スタック, キュー
[Basic 3] 計算量 / 配列, 連結リスト / ハッシュ テーブル / スタック, キュー
 
プログラミングHaskell(第2章)
プログラミングHaskell(第2章)プログラミングHaskell(第2章)
プログラミングHaskell(第2章)
 
Replace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPReplace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JP
 
JavaScript 講習会 #1
JavaScript 講習会 #1JavaScript 講習会 #1
JavaScript 講習会 #1
 

研究生のためのC++ no.4