C++11講座4回
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
第4回はstatic_assertです。(正直もっと後で良かった気もす...
まずは以下のプログラムを見てください。
1: #include <string>
2:
3: using namespace std;
4:
5: //テンプレートを使用した2次元上の点の構造体
6: template<typename T>
7: struct Point
8: {
9: T x, y;
10: };
11:
12: int main()
13: {
14: //数値を扱う型で生成
15: Point<int> pos1;
16: Point<float> pos2;
17:
18: //文字を扱う型で生成(座標を文字で・・・?)
19: Point<char*> pos3;
20: Point<string> pos4;
21:
22: return 0;
23: }
構造体を利用する時に、複数の型で生成できるようにテンプレ...
ただ18行目から先を見ると分かるのですが、やろうと思えば文...
安全性の考慮や本来の目的以外で使わせたくない、そういうと...
・頑張ってassertを使う場合
1: template<typename T>
2: struct Point
3: {
4: T x, y;
5: Point()
6: {
7: assert(sizeof(x) != sizeof(char*));
8: assert(sizeof(x) != sizeof(string));
9: }
10: };
assertでやったことがないのでよく分からないですが、多分こ...
一応これでchar*とstringを検出したら警告が出ます。
ただ、この方法の問題として
・他の型も警告に追加する時記述を増やす必要がある
・char*やstringと同じサイズの他の型でも警告がでる(という...
・警告が出るのは実行した時
等があり、あまり実用的ではありません。
では次に、C++11で追加されたstatic_assertを使用してみまし...
1: template<typename T>
2: struct Point
3: {
4: static_assert(is_arithmetic<T>::value, "T is arithme...
5: T x, y;
6: };
これで最初のプログラムをビルドするとエラー出力として
T is arithmetic!
と自分で書いた文章が出てきます。
static_assertは第1引数の条件が真でない時、第2引数の文をエ...
このstatic_assertの利点は、このコンパイル時にエラーとして...
これによって、わざわざ実行しなくとも間違いを検出すること...
ちなみに今回のstatic_assertの第1引数はC++11の追加ライブラ...
算術型であるかのチェックになります。
※<type_traits>は説明しませんが、算術型、ポインタ型、配列...
static_assertを使わなくとも、プログラムを作ることに問題は...
以上でstatic_assertの説明を終わります。
前→C++11講座3回
次→C++11講座5回
#vote(いいゾ〜これ[3],まっ多少はね?[0],やめてくれよ…(絶...
終了行:
第4回はstatic_assertです。(正直もっと後で良かった気もす...
まずは以下のプログラムを見てください。
1: #include <string>
2:
3: using namespace std;
4:
5: //テンプレートを使用した2次元上の点の構造体
6: template<typename T>
7: struct Point
8: {
9: T x, y;
10: };
11:
12: int main()
13: {
14: //数値を扱う型で生成
15: Point<int> pos1;
16: Point<float> pos2;
17:
18: //文字を扱う型で生成(座標を文字で・・・?)
19: Point<char*> pos3;
20: Point<string> pos4;
21:
22: return 0;
23: }
構造体を利用する時に、複数の型で生成できるようにテンプレ...
ただ18行目から先を見ると分かるのですが、やろうと思えば文...
安全性の考慮や本来の目的以外で使わせたくない、そういうと...
・頑張ってassertを使う場合
1: template<typename T>
2: struct Point
3: {
4: T x, y;
5: Point()
6: {
7: assert(sizeof(x) != sizeof(char*));
8: assert(sizeof(x) != sizeof(string));
9: }
10: };
assertでやったことがないのでよく分からないですが、多分こ...
一応これでchar*とstringを検出したら警告が出ます。
ただ、この方法の問題として
・他の型も警告に追加する時記述を増やす必要がある
・char*やstringと同じサイズの他の型でも警告がでる(という...
・警告が出るのは実行した時
等があり、あまり実用的ではありません。
では次に、C++11で追加されたstatic_assertを使用してみまし...
1: template<typename T>
2: struct Point
3: {
4: static_assert(is_arithmetic<T>::value, "T is arithme...
5: T x, y;
6: };
これで最初のプログラムをビルドするとエラー出力として
T is arithmetic!
と自分で書いた文章が出てきます。
static_assertは第1引数の条件が真でない時、第2引数の文をエ...
このstatic_assertの利点は、このコンパイル時にエラーとして...
これによって、わざわざ実行しなくとも間違いを検出すること...
ちなみに今回のstatic_assertの第1引数はC++11の追加ライブラ...
算術型であるかのチェックになります。
※<type_traits>は説明しませんが、算術型、ポインタ型、配列...
static_assertを使わなくとも、プログラムを作ることに問題は...
以上でstatic_assertの説明を終わります。
前→C++11講座3回
次→C++11講座5回
#vote(いいゾ〜これ[3],まっ多少はね?[0],やめてくれよ…(絶...
ページ名: