C ++で& funcまたはclass :: funcの使用はありますか?
-
03-07-2019 - |
質問
これは一貫していないようです。 Example :: funcの代わりに& Example :: funcを使用するのはなぜですか? Example :: funcまたは& exampleFunctionの使用はありますか? Example :: funcを除外するように関数への参照を作成できるようには思えません。 exampleFunctionは既にポインターを返しているため、& exampleFunctionを使用する方法は考えられません。
#include <iostream>
class Example {
public:
void func() { std::cout <<"print me\n"; }
};
void exampleFunction() { std::cout << "print me too\n"; }
typedef void (Example::*ExampleFunc_t)();
typedef void (*ExampleFunction_t)();
int main()
{
Example e;
ExampleFunc_t f = &Example::func;
ExampleFunction_t f2 = exampleFunction;
(e.*f)();
f2();
return 0;
}
解決
標準が関数へのポインタを定義する方法だからです。
実際には、アドレス演算子&amp;
を使用して関数へのポインターを取得する必要がありますが、通常の関数および静的メンバー関数の場合、関数からポインターへの暗黙的な変換は標準で定義されています。
これは、非静的メンバー関数に対して左辺値を取得できないため、(非静的)メンバー関数に対して定義されていません。
C ++標準から:
4.3関数からポインターへの変換
- 関数型Tの左辺値は、型の右辺値に変換できます &#8220; Tへのポインター。&#8221;結果は、関数へのポインタです。
脚注52を使用:
この変換は、非静的メンバー関数には決して適用されません。 非静的メンバー関数を参照する左辺値は取得できません。
一貫性を保つために、&amp;機能のみを許可すると思いますが、暗黙の変換は単にCの遺産の成果物です...
他のヒント
ポイントは、関数ポインターを使用しています。非常に大まかな例として、次のように、そのクラス型の配列の要素を並べ替える必要のあるいくつかのメンバー変数を持つクラスがあるとします:
struct CL {
int x, y, z;
};
bool sort_by_x(const CL& obj1, const CL& obj2);
bool sort_by_y(const CL& obj1, const CL& obj2);
bool sort_by_z(const CL& obj1, const CL& obj2);
...
CL obj[100];
...
sort(obj, obj+100, sort_by_x);
...
sort(obj, obj+100, sort_by_y);
...
sort(obj, obj+100, sort_by_z);
ここで、std :: sortはCLオブジェクトの配列をソートするために使用されます。 3番目のパラメーター、つまり関数の名前を見てください。 std :: sort関数は、3番目のパラメーターで関数ポインターを受け取り、その関数をコンパレーターとして使用して配列をソートできます。 sort_by_ *関数を定義して、std :: sortが期待どおりに動作するようにする方法は私たち次第です。