MPLとは
をテンプレートにして作成
Check
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
*C++テンプレートメタプログラミング(MPL)とは? [#k6f6be16]
テンプレートメタプログラミングとは、C++のテンプレート(tem...
**テンプレートメタプログラミングのメリット [#m1fd9729]
+ビルド時に処理されるため、エラーや不具合を実行時まで持ち...
+テンプレートによって実現されるため、実行速度が速い。-- ...
+ユーザーが作ったクラスをプラグインしたり、機能拡張が容易...
+通常のプログラミングでは非常に困難な処理を実現できる -- ...
**テンプレートメタプログラミングのデメリット [#sc3a4f8b]
+ビルド時間が長くなる -- コーディングとデバッグのサイクル...
+エラーメッセージが意味不明 -- コンパイラに頑張ってほしい...
+難解なコードになりがち -- 綺麗に書けばなんとか読めます
**テンプレートメタプログラミングの例 [#t680973b]
簡単な例をいくつか紹介します
*** 配列のサイズを得る [#haead551]
配列のサイズを計算するには、#defineマクロとsizeof演算子で...
#define CountOf(x) (sizeof(x) / sizeof(x[0]))
int hoge[100];
printf("%d", CountOf(hoge));
これで"100"がプリントされます。これをテンプレートを使って...
template <typename T, size_t N>
size_t CountOf(const T(&)[N]) {
return N;
}
こうなります。"int hoge[100]"のような単純な配列を与えれば...
テンプレートを使えば配列以外の型にも対応が可能なのです。...
template <typename T>
size_t CountOf(const T& container) {
return container.size();
}
これでOKです。#defineでは同名でオーバーライドできませんし...
*** 条件によって変数の型を変える [#bdc07edb]
if_c <[条件], [真の場合], [偽の場合]>
この"if_c"を使って、要素が固定されているデータ配列があり...
template <size_t N, typename DataType>
struct HogeClass {
typedef if_c<N==1, DataType, std::vector<DataType> >::...
};
例:
HogeClass<1, std::string>::type singleString;
HogeClass<5, std::string>::type vectorString;
if_cの定義
template <bool C, typename T, typename F> struct if_c ...
template <typename T, typename F > struct if_c<f...
*** タイプリスト [#dcfcf174]
STLのlistのように、「型」のリストを扱うMPLです。boostにも...
// NULLクラスの定義
class NullType {};
// タイプリスト
template <typename T, typename U>
struct Typelist {
typedef T Head;
typedef U Tail;
};
// タイプリスト定義用のマクロ
template <typename T1, typename T2, typename T3 = NullT...
, typename T4 = NullT...
, typename T5 = NullT...
, typename T6 = NullT...
, typename T7 = NullT...
, typename T8 = NullT...
>
struct list {
typedef Typelist<T1, Typelist<T2
, Typelist<T3
, Typelist<T4
, Typelist<T5
, Typelist<T6
, Typelist<T7
, Typelist<T8, Typelist<NullType, ...
};
// begin, end, next, derefなどの実装
template <typename Cnt> struct f_ite { typede...
template <typename Cnt> struct begin { typede...
template <typename H, typename T> struct endL { typede...
template <typename T> struct endL<NullType,...
template <typename Cnt> struct end { typede...
template <typename Ite> struct next { typede...
template <typename Ite> struct deref { typede...
使用例
typedef list<ImageBufferRGBA, ImageBufferRGB, ImageBuff...
typedef begin<ImageTypeList>::type ImageTypeListBegin;
typedef end<ImageTypeList>::type ImageTypeListEnd;
template <typename Begin, typename End>
struct ExecuteImageProcT {
typedef typename deref<Begin>::type Type;
template <class Proc>
static void execute(Proc proc, uint32_t fmt) {
if (Type::PixelFormatType == fmt) {
proc.execute<Type>();
}
else {
ExecuteImageProcT<next<Begin>::type, End>::execut...
}
}
};
template <typename End>
struct ExecuteImageProcT<End,End> {
template <class Proc>
static void execute(Proc , PixelFormat) {
};
};
// ここからが使用例
void hoge(uint32_t format) {
struct Proc {
tempalte <typename ImageType>
void execute() {
ImageType img;
// hogehoge
}
}
ExecuteImageProcT<ImageTypeListBegin, ImageTypeListEn...
}
これは、ImageBufferXXXXといういくつかのタイプのイメージバ...
#back
終了行:
*C++テンプレートメタプログラミング(MPL)とは? [#k6f6be16]
テンプレートメタプログラミングとは、C++のテンプレート(tem...
**テンプレートメタプログラミングのメリット [#m1fd9729]
+ビルド時に処理されるため、エラーや不具合を実行時まで持ち...
+テンプレートによって実現されるため、実行速度が速い。-- ...
+ユーザーが作ったクラスをプラグインしたり、機能拡張が容易...
+通常のプログラミングでは非常に困難な処理を実現できる -- ...
**テンプレートメタプログラミングのデメリット [#sc3a4f8b]
+ビルド時間が長くなる -- コーディングとデバッグのサイクル...
+エラーメッセージが意味不明 -- コンパイラに頑張ってほしい...
+難解なコードになりがち -- 綺麗に書けばなんとか読めます
**テンプレートメタプログラミングの例 [#t680973b]
簡単な例をいくつか紹介します
*** 配列のサイズを得る [#haead551]
配列のサイズを計算するには、#defineマクロとsizeof演算子で...
#define CountOf(x) (sizeof(x) / sizeof(x[0]))
int hoge[100];
printf("%d", CountOf(hoge));
これで"100"がプリントされます。これをテンプレートを使って...
template <typename T, size_t N>
size_t CountOf(const T(&)[N]) {
return N;
}
こうなります。"int hoge[100]"のような単純な配列を与えれば...
テンプレートを使えば配列以外の型にも対応が可能なのです。...
template <typename T>
size_t CountOf(const T& container) {
return container.size();
}
これでOKです。#defineでは同名でオーバーライドできませんし...
*** 条件によって変数の型を変える [#bdc07edb]
if_c <[条件], [真の場合], [偽の場合]>
この"if_c"を使って、要素が固定されているデータ配列があり...
template <size_t N, typename DataType>
struct HogeClass {
typedef if_c<N==1, DataType, std::vector<DataType> >::...
};
例:
HogeClass<1, std::string>::type singleString;
HogeClass<5, std::string>::type vectorString;
if_cの定義
template <bool C, typename T, typename F> struct if_c ...
template <typename T, typename F > struct if_c<f...
*** タイプリスト [#dcfcf174]
STLのlistのように、「型」のリストを扱うMPLです。boostにも...
// NULLクラスの定義
class NullType {};
// タイプリスト
template <typename T, typename U>
struct Typelist {
typedef T Head;
typedef U Tail;
};
// タイプリスト定義用のマクロ
template <typename T1, typename T2, typename T3 = NullT...
, typename T4 = NullT...
, typename T5 = NullT...
, typename T6 = NullT...
, typename T7 = NullT...
, typename T8 = NullT...
>
struct list {
typedef Typelist<T1, Typelist<T2
, Typelist<T3
, Typelist<T4
, Typelist<T5
, Typelist<T6
, Typelist<T7
, Typelist<T8, Typelist<NullType, ...
};
// begin, end, next, derefなどの実装
template <typename Cnt> struct f_ite { typede...
template <typename Cnt> struct begin { typede...
template <typename H, typename T> struct endL { typede...
template <typename T> struct endL<NullType,...
template <typename Cnt> struct end { typede...
template <typename Ite> struct next { typede...
template <typename Ite> struct deref { typede...
使用例
typedef list<ImageBufferRGBA, ImageBufferRGB, ImageBuff...
typedef begin<ImageTypeList>::type ImageTypeListBegin;
typedef end<ImageTypeList>::type ImageTypeListEnd;
template <typename Begin, typename End>
struct ExecuteImageProcT {
typedef typename deref<Begin>::type Type;
template <class Proc>
static void execute(Proc proc, uint32_t fmt) {
if (Type::PixelFormatType == fmt) {
proc.execute<Type>();
}
else {
ExecuteImageProcT<next<Begin>::type, End>::execut...
}
}
};
template <typename End>
struct ExecuteImageProcT<End,End> {
template <class Proc>
static void execute(Proc , PixelFormat) {
};
};
// ここからが使用例
void hoge(uint32_t format) {
struct Proc {
tempalte <typename ImageType>
void execute() {
ImageType img;
// hogehoge
}
}
ExecuteImageProcT<ImageTypeListBegin, ImageTypeListEn...
}
これは、ImageBufferXXXXといういくつかのタイプのイメージバ...
#back
ページ名: