このサンプルコードでfunc1
は、はのタイプでvoid (*)(int, double)
ありfunky
、はのタイプですvoid(&)(int, double)
。
#include <iostream>
using namespace std;
void someFunc(int i, double j) {
cout << i << ":" << j << endl;
}
int main(int argc, char *argv[]) {
auto func1 = someFunc;
auto& func2 = someFunc;
cout << typeid(func1).name() << endl;
cout << typeid(func2).name() << endl;
func1(10, 20.0);
func2(10, 30.0);
}
出力は違いを示しています:
PFvidE
FvidE
10:20
10:30
実際には、2つのタイプの違いは何ですか?
関数にポインタを割り当て、後でそのポインタが指すものを変更できるようにしたい場合は、を使用しますauto fp = func
。そうでない場合は、auto& rp = func
再割り当てできないため、参照を使用します。
#include <iostream>
using namespace std;
int funcA(int i, int j) {
return i+j;
}
int funcB(int i, int j) {
return i*j;
}
int main(int argc, char *argv[]) {
auto fp = funcA;
auto& rp = funcA;
cout << fp(1, 2) << endl; // 3 (1 + 2)
cout << rp(1, 2) << endl; // 3 (1 + 2)
fp = funcB;
//rp = funcB; // error: assignment of read-only reference 'rp'
cout << fp(1, 2) << endl; // 2 (1 * 2)
return 0;
}
私は誰もがこれを行う理由のより実用的な例を考え出そうとしていました、以下はユーザー入力に基づいて関数を呼び出すためにポインターの配列を使用するいくつかのコードです(の任意の要素はarr
実行時にポイントに変更することもできます別の機能へ):
#include <iostream>
using namespace std;
void funcA(int i, int j) {
std::cout << "0: " << i << ", " << j << endl;
}
void funcB(int i, int j) {
std::cout << "1: " << i << ", " << j << endl;
}
void funcC(int i, int j) {
std::cout << "2: " << i << ", " << j << endl;
}
int main(int argc, char *argv[]) {
if (argc < 2) {
cout << "Usage: ./a.out <val>" << endl;
exit(0);
}
int index = atoi(argv[1]);
if (index < 0 || index > 2) {
cout << "Out of bounds" << endl;
exit(0);
}
void(* arr[])(int, int) = { funcA, funcB, funcC };
arr[index](1, 2);
return 0;
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加