2009-03-05 11 views
2

これは矛盾しているようです。 Example :: funcの代わりに& Example :: funcを使用するのはなぜですか? Example :: funcまたは& exampleFunctionが使用されていますか?私たちが関数への参照をして、Example :: funcのルールを外すことはできないようです。と私は方法を考えて& exampleFunctionは、すでにポインタを返しますので、関数を考える。には、&funcまたはclass :: funcのC++での使用がありますか?

#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; 
} 

答えて

6

標準が関数へのポインタを定義する方法です。

通常、関数へのポインタを得るにはアドレス演算子&を使用する必要がありますが、標準関数と静的メンバ関数では、関数からポインタ関数への暗黙的変換が標準で定義されています。

静的でないメンバー関数に対して左辺値を取得できないため、(静的でない)メンバー関数に対しては定義されていません。 C++標準から

4.3ファンクションへのポインタ変換

  1. 関数型Tの左辺値は、タイプ 「Tへのポインタの右辺値に変換することができます。結果は関数へのポインタです。
  2. 脚注52と

非静的メンバ関数を指す 左辺値を得ることができないので、この変換は、非静的メンバ関数に適用されることはありません。

私は、彼らはむしろ唯一の暗黙的な変換は、単にC遺産のアーティファクトであることを一貫性の理由から、&機能を許可しますが、したいと思います... Cで

+0

は++も参照(のtypedefが機能していますvoid(&FuncRef_t)())ではなく、メンバ関数の参照ではありません。 – dalle

+0

ええ、私は関数の暗黙の変換を持つと便利だと思います。とにかくポインタを渡すことが多いので(関数を渡すことはできないので、暗黙の変換によってポインタを渡します)。私は、T :: fが不十分である理由はあまり曖昧であると推測します。もしそれが –

+0

のメンバ関数ポインタであれば、Base :: f();を書くことはできません。基本クラス関数を呼び出す。 (this - > * Base :: f)();を書く必要があります。それはまあまあです。だから、&T :: fooを持ってポインタを得ることは良い解決策だと思います。 –

1

ポイントはFunction Pointersを使用しています。 ::ソートに使用されてSTDここ

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); 

:非常に荒いたとえば、あなたがこのようなあなたがそのクラス型の配列の要素をソートする必要があるかもしれませんそれによっていくつかのメンバ変数を持つクラスを、持っていると仮定CLオブジェクトの配列をソートする。 3番目のパラメータを見てください。関数の名前です。 std :: sort関数は、3番目のパラメータで関数ポインタを取り、その関数をコンパレータとして使用して配列をソートすることができます。 std :: sortが期待どおりに動作するようにsort_by_ *関数を定義する方法は、私たちまで可能です。

関連する問題