|
|
[C++11]ラムダ式で再帰 |
2014年12月09日21:54:59 |
|
ラムダ式単独で再帰を表現できるのでサンプルコードをご紹介します。 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| #include <cstdio>
#include <functional>
int main()
{
std::function<int(int)> factorial = [&factorial](int i) -> int
{
if( i == 1 )
{
return 1;
}
return i*factorial(i-1);
};
printf( "%d\n", factorial(5) );
return 0;
} |
出力:
120 |
ラムダ式単独で再帰が表現できて非常に便利ですね!
面白い点は、自分自身をキャプチャに指定できてしまう所だと思います。
注意点は、ラムダで再帰を行う際には型解決の問題でauto変数に代入出来ないので
必ずstd::functionを経由しなければならない点です。
autoにするとコンパイルエラーになります。
auto変数についての説明はこちら
[C++11]auto変数を使おう!ただし慎重に...
ラムダ式についての説明はこちら
[C++11]ラムダ式(無名関数、匿名関数)とstd::function |
|
[C++]型を自在に変換~キャスト演算子のオーバーロード~ |
2014年12月05日11:45:05 |
|
キャスト演算子のオーバーロードを行っておくと必要な型に応じて
暗黙的にキャストを行ってくれます。 自在に好きな型へと変換でき便利です。
乱用すると黒魔術化するのでご利用は計画的に!
異論があるかもしれませんが、筆者はこの機能が大好きです。
書き方:
operator 型() 修飾子
この機能を利用して参照を返す事は可能ですが暗黒面に足を踏み入れる
トリッキーなコードになってしまいますので参照の利用は控えた方がいいと思います。
※ただし読み取り専用のconst参照であればいいと考えます。 |
サンプルコード |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
| #include <cstdio>
#include <string>
class Integer
{
private:
int m_Int;
public:
Integer(int i = 0)
{
m_Int = i;
}
operator int() const
{
return m_Int;
}
operator double() const
{
return (double)m_Int;
}
operator std::string() const
{
char buffer[16] = {};
sprintf( buffer, "%d", m_Int );
return buffer;
}
};
void Print( int i, double d, const std::string& s )
{
printf( "int=%d, double=%f, string=%s\n", i, d, s.c_str() );
}
int main()
{
Integer integer = 10;
int i = integer;
double d = integer;
std::string s = integer;
printf( "int=%d, double=%f, string=%s\n", i, d, s.c_str() );
printf( "int=%d, double=%f, string=%s\n",
(int)integer, (double)integer, ((std::string)integer).c_str() );
Print( integer, integer, integer );
return 0;
} |
出力:
int=10, double=10.000000, string=10
int=10, double=10.000000, string=10
int=10, double=10.000000, string=10 |
これを利用すると見た目が非常にすっきりしコンパイラの警告を
抑止する為だけに行っていたキャストを省略することができます。
To○○系の変換メソッドを作成してもよいのですがキャスト演算子の使用も
便利だと思いますので状況に応じてご判断下さい。
キャスト演算子のオーバーロードはテンプレートも使えます。 |
テンプレートを用いたサンプルコード |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
| #include <cstdio>
#include <string>
class Integer
{
private:
int m_Int;
public:
Integer(int i = 0)
{
m_Int = i;
}
template <class T>
operator T() const
{
return (T)m_Int;
}
operator std::string() const
{
char buffer[16] = {};
sprintf( buffer, "%d", m_Int );
return buffer;
}
};
int main()
{
Integer integer = 65;
printf( "char=%c short=%d int=%d, float=%f double=%f, string=%s\n",
(char)integer, (short)integer, (int)integer,
(float)integer, (double)integer, ((std::string)integer).c_str() );
return 0;
} |
出力:
char=A short=65 int=65, float=65.000000 double=65.000000, string=65 |
|
[C#]起動時に非表示のFormの作り方 |
2014年12月04日23:59:01 |
|
優秀な後輩がやっていた方法のご紹介です。
Shownイベント時にVisibleにfalseを設定すると起動時にFormを
非表示にすることが可能です。
コンストラクタやLoadイベント時にVisibleにfalseを指定しても有効になりません。
Application.Run()を使ったり透明度を0にして実現しておられる方も
いらっしゃいましたが、私はこの方法が一番しっくりきます。 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
| using System;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Shown(object sender, EventArgs e)
{
Visible = false;
}
}
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
} |
|
|