C++:関数を引数に設定する
関数を引数に設定することで
関数に汎用性が大きくなる
ということで
今回は関数を引数に設定する方法です
さっそく、Cでの例を挙げます
●例1(Cの場合)
int funcA(int a, int b,int (*funcB)(int,int)){
int c = funcB(a,b);
return c;
}
funcBには引数にint型の変数2つを取ることができ、intを返す関数が入ります
●インラインとは何??
C++ではもっとオーバーヘッドを無くす(速度を上げる)方法があるそうで
それがインライン関数みたいです
インライン=マクロみたいなものです
⇒基本的な書き方
inline int A(int x){
return x;
}
⇒注意
コンパイル時にプリプロセッサにより全て展開されるので実体は使用分だけ存在してしまう
つまり、コンパイル後の実質的なメモリが多くなる??ってな感じだと思います
と、C++の場合に入る前にもう1つ知識がいるようでして…
●テンプレート関数(template<引数の設定>)とは??
どんな型でも1つの関数で扱えるようにする仕組みを持っているのが
テンプレート関数だそうです
template<class T>
T max(const T& a, const T& b)
{
return ( a > b ) ? ( a ) : ( b );
}
※class = typenameでも良い
例えばmax( 100, 150 );で上記のテンプレート関数を呼び出した場合
int max(const int& a, const int& b)
{
return ( a > b ) ? ( a ) : ( b );
}
となるみたいです
知識無さ過ぎですねw
勉強しまっす
では、C++の場合の例に移ります
●例2(C++の場合) インライン展開
template<typename STRUCT, int SIZE>
void initialize(int matrix[SIZE][SIZE])
{
for(int row = 0; row < SIZE; ++row)
{
for(int col = 0; col < SIZE; ++col)
{
matrix[row][col] = STRUCT::generate(row, col);
}
}
}
struct struct_A
{
inline static int func(int, int)
{
return 0;
}
};
struct struct_B
{
inline static int func(int row, int col)
{
return (row == col) ? 1 : 0;
}
};
int main(int, char* [])
{
int m[10][10];
initialize<sturct_A>(m);
initialize<sturct_B>(m);
return 0;
}
※initializeのtemplateのSIZEを呼び出していませんが
引数に配列を入れた時点で設定されるようですね
構造体のstruct_Aとstruct_Bどちらを選択するかによって
関数の内容が変わるようになっています
●まとめ
Cの記述は楽
C++の記述は面倒だけど、プログラムの速度アップにつながる
(ただし、メモリが大きくなる)
[0回]
PR