C++ TIPS 3
をテンプレートにして作成
Check
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
#include(C++TipsMenu,notitle)
* 3次元空間での直線と点の距離を求める式 [#r1197549]
意外とググってもすぐに出てこなかったのでメモ
#sh(cpp){{
// 直線 A-B と 点Pの距離
float distance(Vector3 A, Vector3 B, Vector3 P) {
auto pqr = B - A;
auto abc = P - A;
pqr.Normalize();
float t = abc.dot(pqr) / (pqr.X * pqr.X + pqr.Y * pqr.Y...
return abc.distance(pqr * t);
}
}}
※Vector3 は、要素X,Y,Zを持つよくあるクラス。dotは内積、di...
* boost::variantはコピー不可のクラスを扱えないようです [#...
Clang3.4 boost-1.56.0 の環境ですが、以下のプログラムをビ...
なんとかならないでしょうか?
#sh(cpp){{
#include <boost/varialt.hpp>
class Hoge; // コピー不可のクラス
class Fuga; // コピー不可のクラス
boost::variant<Hoge,Fuga> value; // 初期値はOK
...
apply_visitor(ShowVisitor(), value); // visitorもOK
...
value = Fuga(); // Compile Error! 代入でエラー
}}
http://melpon.org/wandbox/permlink/64XhvvhAnBBmYaVU
* enumをフラグとしてつかうためのユーティリティー [#y45a7a...
#sh(cpp){{
template <typename Enum, typename Integer = uint32_t>
struct EnumFlags {
using Type = Enum;
Integer value_;
EnumFlags(Integer v = 0) : value_(v) {
static_assert(std::is_integral<Integer>::value, "...
}
EnumFlags(const EnumFlags& e) : value_(e.value_) {}
EnumFlags(Type e) : value_(get(e)) {}
bool any_of(const EnumFlags& a) const { return (value...
bool all_of(const EnumFlags& a) const { return (value...
bool check(Type e) const { return (value_ & get(e)) !...
Integer get(Type e) const { return static_cast<Intege...
EnumFlags operator | (Type e) const {
return EnumFlags(value_ | get(e));
}
EnumFlags& operator |= (Type e) {
value_ |= get(e);
return *this;
}
};
template <typename E>
EnumFlags<E> operator | (E v1, E v2) {
EnumFlags<E> e(v1);
return e |= v2;
}
}}
使用例
#sh(cpp){{
#include <iostream>
#include <type_traits>
enum class EHoge {
Hoge ,
Fuga ,
Piyo ,
Boo ,
Honya
};
int main() {
using namespace std;
EnumFlags<EHoge> e1 = EHoge::Hoge | EHoge::Piyo;
e1 |= EHoge::Fuga;
cout << (e1.check(EHoge::Fuga) ? "has Fuga" : "no Fug...
cout << (e1.any_of(EHoge::Hoge | EHoge::Piyo) ? "has ...
cout << (e1.all_of(EHoge::Hoge | EHoge::Piyo) ? "has ...
}
}}
http://melpon.org/wandbox/permlink/u5b5tLUl49YUxLmW
* 一時オブジェクトの寿命についての注意 [#t655d13c]
一時オブジェクトは、次の行にいくと寿命が尽きてそのオブジ...
実装の具合や最適化オプション、コンパイラの種類によっては...
#sh(cpp){{
#include <iostream>
using namespace std;
struct Hoge {
const char* char_ = nullptr;
Hoge(const char* c) : char_(c) {}
};
struct Piyo {
const Hoge* hoge_;
Piyo(const Hoge& hoge) : hoge_(&hoge) {
//cout << "Piyo(hoge)" << endl; // このコメントを...
}
};
int main() {
Piyo piyo = Piyo(Hoge("hogehoge"));
// 上のHogeの寿命は尽きているので、piyo.hoge_ は未定...
// 何のエラーもなく動いてしまうのが怖い。
// Piyoのコンストラクタに実装を書くか、最適化を外すと...
if (piyo.hoge_->char_ == nullptr) {
cout << "Error!" << endl;
}
else {
cout << piyo.hoge_->char_;
}
}
}}
http://melpon.org/wandbox/permlink/3x1ZGslfSFw7IGFG
* 指定した値で初期化するenumクラス [#t10b75af]
enumで定義した変数は、暗黙のコンストラクタが呼ばれるとゼ...
特定の値(たとえば、-1など)で初期化したい場合に便利なenu...
#sh(cpp){{
#include <iostream>
#include <map>
using namespace std;
enum Hoges {
Invalid = -1,
Hoge = 0,
Fuga = 1,
Piyo = 2,
Hogera = 3,
PiyoPiyo = 4,
};
// このmapは、値の初期値はHogeになる
map <int, Hoges> hoges1;
// 初期値をテンプレートパラメータで指定するenumクラス
template <typename EnumType, EnumType InitialValue>
struct initialized_enum {
EnumType value_;
initialized_enum(EnumType v = InitialValue) : value_(...
operator EnumType () const { return value_; }
};
// このmapは、初期値がInvalid(-1)になる
map <int, initialized_enum<Hoges, Invalid>> hoges2;
int main() {
// Hogesの初期値は、Invalidにしたいけど、Hogeになる
cout << hoges1[0] << endl;
// initialized_enumだと、初期値を入れてくれる
cout << hoges2[0] << endl;
}
}}
http://melpon.org/wandbox/permlink/DSQ21IThska1JTQk
* テンプレートクラスのクラス変数(staticなインスタンス)を...
通常のクラス変数は、cppなどで明示的に宣言しないとインスタ...
テンプレートクラスの場合は、ヘッダファイルで宣言するだけ...
意外と知られていないですが、便利な機能です。
http://melpon.org/wandbox/permlink/kKGoK7YiFfmkJyyM
* VisualStudioで、文字リテラルをUTF-8にする [#aa50c61d]
VisualStudioでは、ソースファイルの文字形式にかかわらず、...
たとえば、printf("漢字")というプログラムで、ソースコード...
コンパイル時の文字コード変換機能をOFFにするやり方はわかり...
#sh(cpp){{
#if defined(_MSC_VER)
// 文字リテラルをUTF-8として処理する
#pragma execution_character_set("utf-8")
#endif
}}
* boost regex の使い方メモ [#i7857ca0]
XMLの文字エスケープのサンプル
#sh(cpp){{
#include <iostream> ...
#include <string> ...
#include <boost/regex.hpp> ...
...
namespace { ...
using std::string; ...
using boost::regex; ...
using boost::regex_replace; ...
...
string escape(const string& src) { ...
regex reg("(<)|(>)|(&)|(\\\")|(')"); ...
string fmt("(?1<)(?2>)(?3&)(?4")(?5&ap...
return regex_replace(src, reg, fmt, boost::match_defa...
} ...
string unescape(const string& src) { ...
regex reg("(<)|(>)|(&)|(")|(')");...
string fmt("(?1<)(?2>)(?3&)(?4\\\")(?5')"); ...
return regex_replace(src, reg, fmt, boost::match_defa...
} ...
} ...
...
int main() ...
{ ...
using namespace std; ...
string src = "hoge<hoge> fuga<'fuga'> &>_<\" <o'o> <...
string result = escape(src); ...
cout << src << result << unescape(result); ...
} ...
}}
output
hoge<hoge> fuga<'fuga'> &>_<" <o'o> < &
hoge<hoge> fuga<'fuga'> &>_...
hoge<hoge> fuga<'fuga'> &>_<" <o'o> < &
* 複数の引数を必要とするオブジェクトのemplace (C++11) [#r...
便利で高速なemplaceですが、mapやunordered_mapのように、pa...
1つの値から生成できるkey, valueの場合は問題ないのですが、
#sh(cpp){{
map<int,int> hoge;
hoge.emplace(1,2); // OK
}}
生成に2つの値が必要なクラスを格納する場合、問題があります。
#sh(cpp){{
struct Point {
Point(int x, int y);
};
map<int, Point> hoge;
hoge.emplace(1,2,3); // コンパイルエラー
}}
この書式では、(1,2,3)から、pair<int(1), Point(2,3)> を推...
こんな時は、"piecewise_construct"という呪文を使えば、pair...
#sh(cpp){{
#include <vector>
#include <map>
#include <iostream>
struct Point {
int x_;
int y_;
Point(int x,int y) : x_(x), y_(y) {}
};
int main(int ac, char* av[]) {
using namespace std;
// vectorなら問題 ない//
vector<Point> hoge;
hoge.emplace_back(1,2);
// mapの場合は、key,valueでOK!
map<string, int> intMap;
intMap.emplace("hoge", 1);
// valueのコンストラクタの引数が2個以上の場合は厄介!
map<string, Point> hogeMap;
// hogeMap.emplace("hoge", 1, 2); // compile error!
hogeMap.emplace(piecewise_construct // pairの...
, forward_as_tuple("hoge") // tuple型...
, forward_as_tuple(1,2)); // forward...
}
}}
参考URL
- piecewise_constructについて ...
-- https://sites.google.com/site/cpprefjp/reference/utili...
- forward_as_tupleについて ...
-- https://sites.google.com/site/cpprefjp/reference/tuple...
* 定数の定義と静的構造体テーブルを同時に作るマクロ [#s2f2...
定数の定義をソースコード上で行う場合、定数の定義と値の定...
通常はこのように書きます。
#sh(cpp){{
enum EnumHoge { hoge, fuga, piyo };
struct HogeHoge {
EnumHoge id;
float value;
const char* name;
} const table[] = {
{ hoge, 1.0f, "hoge" },
{ fuga, 2.0f, "fuga" },
{ piyo, 3.0f, "piyo" },
};
}}
enumの定義と構造体の定義が冗長で、名前の文字列の定義も冗...
しかし、魂を悪魔(#define)に売り渡せば、一発で記述できます。
#sh(c){{
// ここで定数を定義する(冗長でない単一の記載で済ませる)
#define LIST \
DEF(hoge, 1.0f), \
DEF(fuga, 2.0f), \
DEF(piyo, 3.0f)
// enumの生成
#undef DEF
#define DEF(a, b) a
enum EnumHoge { LIST };
// 構造体の生成
#undef DEF
#define DEF(a, b) {a, b, #a}
struct HogeHoge {
EnumHoge id;
float value;
const char* name;
} const table[] = { LIST };
}}
使用例
#sh(cpp){{
#include <stdio.h>
int main(int ac, char*av []) {
for (size_t n = 0; n < sizeof(table)/sizeof(HogeHoge);...
printf("table[%d] = id:%d value:%f name='%s'\n", n, ...
}
}
}}
結果
table[0] = id:0 value:1.000000 name='hoge'
table[1] = id:1 value:2.000000 name='gufa'
table[2] = id:2 value:3.000000 name='piyo'
ideone: http://ideone.com/HEIsAa#view_edit_box
* コンテナに対して、pushとpush_backを自動判別して追加する...
#sh(cpp){{
// decltypeを使ってコンテナに要素を追加する
// push_back()を持っている場合 ...
template <typename CT, typename VT>
inline auto push_to_container(CT& container, VT&& val, ...
{
return container.push_back(val);
}
// push()がある場合 ...
template <typename CT, typename VT>
inline auto push_to_container(CT& container, VT&& val) ...
{
return container.push(val);
}
}}
使用例
#sh(c){{
std::vector<int> hoge;
std::priority_queue<int> fuga;
...
push_to_container(hoge, 1); // hoge.push_back(1)が呼ばれる
push_to_container(fuga, 1); // fuga.push(1)が呼ばれる
}}
参考にしたページ
[[メンバー関数の存在を確かめる方法>http://codelogy.org/ar...
* VC++でイテレーターを高速化する [#lc845c91]
VC++では、イテレーターの範囲チェックが行われており、安全...
以下の定義を行うことで、範囲チェックを無効にできます。([[...
#define _SECURE_SCL 0
ちなみに、以下の設定で範囲チェックが有効になります。
#define _SECURE_SCL_1
#define _HAS_ITERATOR_DEBUGGING 1
* boost mpl map for_each覚え書き [#p7da01c4]
boost::mplのvectorやmapをfor_eachするサンプル。
mapのkeyだけ回すmap_keysのようなフィルタの例も作ってみま...
#sh(cpp){{
#include <iostream>
#include <vector>
#include <string>
#include <typeinfo>
#include <boost/mpl/list.hpp>
#include <boost/mpl/map.hpp>
#include <boost/mpl/for_each.hpp>
#include <boost/mpl/key_type.hpp>
using namespace boost;
using namespace std;
struct Disp {
template <class Type>
void operator()(const Type&) const {
cout << typeid(Type).name() << endl;
}
template <typename K, typename V>
void operator()(const mpl::pair<K,V>&) const {
cout << typeid(K).name() << "," << typeid(V).nam...
}
} disp;
int main()
{
typedef mpl::list<int, std::string, char, std::vecto...
typedef mpl::map<mpl::pair<int,char>, mpl::pair<int,...
cout << "mpl list test" << endl;
mpl::for_each<tl>(disp);
cout << "mpl map test" << endl;
mpl::for_each<t2>(disp);
cout << "mpl map key_type test" << endl;
mpl::for_each<t2, mpl::lambda<mpl::key_type<t2, mpl:...
cout << "finish" << endl;
return 0;
}
}}
cpp_akiraさんのページにあったサンプルにmapを足してみまし...
http://ideone.com/rrk1ZY
終了行:
#include(C++TipsMenu,notitle)
* 3次元空間での直線と点の距離を求める式 [#r1197549]
意外とググってもすぐに出てこなかったのでメモ
#sh(cpp){{
// 直線 A-B と 点Pの距離
float distance(Vector3 A, Vector3 B, Vector3 P) {
auto pqr = B - A;
auto abc = P - A;
pqr.Normalize();
float t = abc.dot(pqr) / (pqr.X * pqr.X + pqr.Y * pqr.Y...
return abc.distance(pqr * t);
}
}}
※Vector3 は、要素X,Y,Zを持つよくあるクラス。dotは内積、di...
* boost::variantはコピー不可のクラスを扱えないようです [#...
Clang3.4 boost-1.56.0 の環境ですが、以下のプログラムをビ...
なんとかならないでしょうか?
#sh(cpp){{
#include <boost/varialt.hpp>
class Hoge; // コピー不可のクラス
class Fuga; // コピー不可のクラス
boost::variant<Hoge,Fuga> value; // 初期値はOK
...
apply_visitor(ShowVisitor(), value); // visitorもOK
...
value = Fuga(); // Compile Error! 代入でエラー
}}
http://melpon.org/wandbox/permlink/64XhvvhAnBBmYaVU
* enumをフラグとしてつかうためのユーティリティー [#y45a7a...
#sh(cpp){{
template <typename Enum, typename Integer = uint32_t>
struct EnumFlags {
using Type = Enum;
Integer value_;
EnumFlags(Integer v = 0) : value_(v) {
static_assert(std::is_integral<Integer>::value, "...
}
EnumFlags(const EnumFlags& e) : value_(e.value_) {}
EnumFlags(Type e) : value_(get(e)) {}
bool any_of(const EnumFlags& a) const { return (value...
bool all_of(const EnumFlags& a) const { return (value...
bool check(Type e) const { return (value_ & get(e)) !...
Integer get(Type e) const { return static_cast<Intege...
EnumFlags operator | (Type e) const {
return EnumFlags(value_ | get(e));
}
EnumFlags& operator |= (Type e) {
value_ |= get(e);
return *this;
}
};
template <typename E>
EnumFlags<E> operator | (E v1, E v2) {
EnumFlags<E> e(v1);
return e |= v2;
}
}}
使用例
#sh(cpp){{
#include <iostream>
#include <type_traits>
enum class EHoge {
Hoge ,
Fuga ,
Piyo ,
Boo ,
Honya
};
int main() {
using namespace std;
EnumFlags<EHoge> e1 = EHoge::Hoge | EHoge::Piyo;
e1 |= EHoge::Fuga;
cout << (e1.check(EHoge::Fuga) ? "has Fuga" : "no Fug...
cout << (e1.any_of(EHoge::Hoge | EHoge::Piyo) ? "has ...
cout << (e1.all_of(EHoge::Hoge | EHoge::Piyo) ? "has ...
}
}}
http://melpon.org/wandbox/permlink/u5b5tLUl49YUxLmW
* 一時オブジェクトの寿命についての注意 [#t655d13c]
一時オブジェクトは、次の行にいくと寿命が尽きてそのオブジ...
実装の具合や最適化オプション、コンパイラの種類によっては...
#sh(cpp){{
#include <iostream>
using namespace std;
struct Hoge {
const char* char_ = nullptr;
Hoge(const char* c) : char_(c) {}
};
struct Piyo {
const Hoge* hoge_;
Piyo(const Hoge& hoge) : hoge_(&hoge) {
//cout << "Piyo(hoge)" << endl; // このコメントを...
}
};
int main() {
Piyo piyo = Piyo(Hoge("hogehoge"));
// 上のHogeの寿命は尽きているので、piyo.hoge_ は未定...
// 何のエラーもなく動いてしまうのが怖い。
// Piyoのコンストラクタに実装を書くか、最適化を外すと...
if (piyo.hoge_->char_ == nullptr) {
cout << "Error!" << endl;
}
else {
cout << piyo.hoge_->char_;
}
}
}}
http://melpon.org/wandbox/permlink/3x1ZGslfSFw7IGFG
* 指定した値で初期化するenumクラス [#t10b75af]
enumで定義した変数は、暗黙のコンストラクタが呼ばれるとゼ...
特定の値(たとえば、-1など)で初期化したい場合に便利なenu...
#sh(cpp){{
#include <iostream>
#include <map>
using namespace std;
enum Hoges {
Invalid = -1,
Hoge = 0,
Fuga = 1,
Piyo = 2,
Hogera = 3,
PiyoPiyo = 4,
};
// このmapは、値の初期値はHogeになる
map <int, Hoges> hoges1;
// 初期値をテンプレートパラメータで指定するenumクラス
template <typename EnumType, EnumType InitialValue>
struct initialized_enum {
EnumType value_;
initialized_enum(EnumType v = InitialValue) : value_(...
operator EnumType () const { return value_; }
};
// このmapは、初期値がInvalid(-1)になる
map <int, initialized_enum<Hoges, Invalid>> hoges2;
int main() {
// Hogesの初期値は、Invalidにしたいけど、Hogeになる
cout << hoges1[0] << endl;
// initialized_enumだと、初期値を入れてくれる
cout << hoges2[0] << endl;
}
}}
http://melpon.org/wandbox/permlink/DSQ21IThska1JTQk
* テンプレートクラスのクラス変数(staticなインスタンス)を...
通常のクラス変数は、cppなどで明示的に宣言しないとインスタ...
テンプレートクラスの場合は、ヘッダファイルで宣言するだけ...
意外と知られていないですが、便利な機能です。
http://melpon.org/wandbox/permlink/kKGoK7YiFfmkJyyM
* VisualStudioで、文字リテラルをUTF-8にする [#aa50c61d]
VisualStudioでは、ソースファイルの文字形式にかかわらず、...
たとえば、printf("漢字")というプログラムで、ソースコード...
コンパイル時の文字コード変換機能をOFFにするやり方はわかり...
#sh(cpp){{
#if defined(_MSC_VER)
// 文字リテラルをUTF-8として処理する
#pragma execution_character_set("utf-8")
#endif
}}
* boost regex の使い方メモ [#i7857ca0]
XMLの文字エスケープのサンプル
#sh(cpp){{
#include <iostream> ...
#include <string> ...
#include <boost/regex.hpp> ...
...
namespace { ...
using std::string; ...
using boost::regex; ...
using boost::regex_replace; ...
...
string escape(const string& src) { ...
regex reg("(<)|(>)|(&)|(\\\")|(')"); ...
string fmt("(?1<)(?2>)(?3&)(?4")(?5&ap...
return regex_replace(src, reg, fmt, boost::match_defa...
} ...
string unescape(const string& src) { ...
regex reg("(<)|(>)|(&)|(")|(')");...
string fmt("(?1<)(?2>)(?3&)(?4\\\")(?5')"); ...
return regex_replace(src, reg, fmt, boost::match_defa...
} ...
} ...
...
int main() ...
{ ...
using namespace std; ...
string src = "hoge<hoge> fuga<'fuga'> &>_<\" <o'o> <...
string result = escape(src); ...
cout << src << result << unescape(result); ...
} ...
}}
output
hoge<hoge> fuga<'fuga'> &>_<" <o'o> < &
hoge<hoge> fuga<'fuga'> &>_...
hoge<hoge> fuga<'fuga'> &>_<" <o'o> < &
* 複数の引数を必要とするオブジェクトのemplace (C++11) [#r...
便利で高速なemplaceですが、mapやunordered_mapのように、pa...
1つの値から生成できるkey, valueの場合は問題ないのですが、
#sh(cpp){{
map<int,int> hoge;
hoge.emplace(1,2); // OK
}}
生成に2つの値が必要なクラスを格納する場合、問題があります。
#sh(cpp){{
struct Point {
Point(int x, int y);
};
map<int, Point> hoge;
hoge.emplace(1,2,3); // コンパイルエラー
}}
この書式では、(1,2,3)から、pair<int(1), Point(2,3)> を推...
こんな時は、"piecewise_construct"という呪文を使えば、pair...
#sh(cpp){{
#include <vector>
#include <map>
#include <iostream>
struct Point {
int x_;
int y_;
Point(int x,int y) : x_(x), y_(y) {}
};
int main(int ac, char* av[]) {
using namespace std;
// vectorなら問題 ない//
vector<Point> hoge;
hoge.emplace_back(1,2);
// mapの場合は、key,valueでOK!
map<string, int> intMap;
intMap.emplace("hoge", 1);
// valueのコンストラクタの引数が2個以上の場合は厄介!
map<string, Point> hogeMap;
// hogeMap.emplace("hoge", 1, 2); // compile error!
hogeMap.emplace(piecewise_construct // pairの...
, forward_as_tuple("hoge") // tuple型...
, forward_as_tuple(1,2)); // forward...
}
}}
参考URL
- piecewise_constructについて ...
-- https://sites.google.com/site/cpprefjp/reference/utili...
- forward_as_tupleについて ...
-- https://sites.google.com/site/cpprefjp/reference/tuple...
* 定数の定義と静的構造体テーブルを同時に作るマクロ [#s2f2...
定数の定義をソースコード上で行う場合、定数の定義と値の定...
通常はこのように書きます。
#sh(cpp){{
enum EnumHoge { hoge, fuga, piyo };
struct HogeHoge {
EnumHoge id;
float value;
const char* name;
} const table[] = {
{ hoge, 1.0f, "hoge" },
{ fuga, 2.0f, "fuga" },
{ piyo, 3.0f, "piyo" },
};
}}
enumの定義と構造体の定義が冗長で、名前の文字列の定義も冗...
しかし、魂を悪魔(#define)に売り渡せば、一発で記述できます。
#sh(c){{
// ここで定数を定義する(冗長でない単一の記載で済ませる)
#define LIST \
DEF(hoge, 1.0f), \
DEF(fuga, 2.0f), \
DEF(piyo, 3.0f)
// enumの生成
#undef DEF
#define DEF(a, b) a
enum EnumHoge { LIST };
// 構造体の生成
#undef DEF
#define DEF(a, b) {a, b, #a}
struct HogeHoge {
EnumHoge id;
float value;
const char* name;
} const table[] = { LIST };
}}
使用例
#sh(cpp){{
#include <stdio.h>
int main(int ac, char*av []) {
for (size_t n = 0; n < sizeof(table)/sizeof(HogeHoge);...
printf("table[%d] = id:%d value:%f name='%s'\n", n, ...
}
}
}}
結果
table[0] = id:0 value:1.000000 name='hoge'
table[1] = id:1 value:2.000000 name='gufa'
table[2] = id:2 value:3.000000 name='piyo'
ideone: http://ideone.com/HEIsAa#view_edit_box
* コンテナに対して、pushとpush_backを自動判別して追加する...
#sh(cpp){{
// decltypeを使ってコンテナに要素を追加する
// push_back()を持っている場合 ...
template <typename CT, typename VT>
inline auto push_to_container(CT& container, VT&& val, ...
{
return container.push_back(val);
}
// push()がある場合 ...
template <typename CT, typename VT>
inline auto push_to_container(CT& container, VT&& val) ...
{
return container.push(val);
}
}}
使用例
#sh(c){{
std::vector<int> hoge;
std::priority_queue<int> fuga;
...
push_to_container(hoge, 1); // hoge.push_back(1)が呼ばれる
push_to_container(fuga, 1); // fuga.push(1)が呼ばれる
}}
参考にしたページ
[[メンバー関数の存在を確かめる方法>http://codelogy.org/ar...
* VC++でイテレーターを高速化する [#lc845c91]
VC++では、イテレーターの範囲チェックが行われており、安全...
以下の定義を行うことで、範囲チェックを無効にできます。([[...
#define _SECURE_SCL 0
ちなみに、以下の設定で範囲チェックが有効になります。
#define _SECURE_SCL_1
#define _HAS_ITERATOR_DEBUGGING 1
* boost mpl map for_each覚え書き [#p7da01c4]
boost::mplのvectorやmapをfor_eachするサンプル。
mapのkeyだけ回すmap_keysのようなフィルタの例も作ってみま...
#sh(cpp){{
#include <iostream>
#include <vector>
#include <string>
#include <typeinfo>
#include <boost/mpl/list.hpp>
#include <boost/mpl/map.hpp>
#include <boost/mpl/for_each.hpp>
#include <boost/mpl/key_type.hpp>
using namespace boost;
using namespace std;
struct Disp {
template <class Type>
void operator()(const Type&) const {
cout << typeid(Type).name() << endl;
}
template <typename K, typename V>
void operator()(const mpl::pair<K,V>&) const {
cout << typeid(K).name() << "," << typeid(V).nam...
}
} disp;
int main()
{
typedef mpl::list<int, std::string, char, std::vecto...
typedef mpl::map<mpl::pair<int,char>, mpl::pair<int,...
cout << "mpl list test" << endl;
mpl::for_each<tl>(disp);
cout << "mpl map test" << endl;
mpl::for_each<t2>(disp);
cout << "mpl map key_type test" << endl;
mpl::for_each<t2, mpl::lambda<mpl::key_type<t2, mpl:...
cout << "finish" << endl;
return 0;
}
}}
cpp_akiraさんのページにあったサンプルにmapを足してみまし...
http://ideone.com/rrk1ZY
ページ名: