2012-01-09 19 views
3

一部の言語(PHPとJavaScriptが気になる)では、関数として変数を使用できます。例:C++で変数を関数として使用する方法は?

PHP: Class::$var_function(); 

スイッチまたはif文を必要としない方法でこれを行うことは可能ですか?

+0

上記のPHPスニペットは変数を関数として使用していないことを指摘しておきます。これは、メソッド呼び出しのために識別子を動的に作成する*(変数変数の一形式)に変数を使用しています。以下のC/C++コードでは、関数への実際の "ハンドル"(関数ポインタまたはstd ::関数)が使用され、識別子自体はstable.commentsが5分間のみ編集可能です(このボックスをクリックして閉じる) –

+0

(この場合のPHPとはまったく違うJavaScriptの場合、関数は適切なファーストクラスの値で、他のオブジェクトの値と同様に動作します:オブジェクトはそれ自身です) –

答えて

4

おそらくジェームスの答えが最高です。しかし、あなたがC++ 11互換性のあるコンパイラを使用している場合、あなたが交互にSTDを使用することができます::例えば機能

#include <functional> 
#include <iostream> 
typedef std::function<void(int a)> callback_t; 

class A { 
public: 
    void fn(int a) { std::cout << a << std::endl; } 
}; 

void fn2(int b) { std::cout << a << std::endl; } 

int main() { 
    A a; 
    callback_t c = std::bind(&A::fn, a, std::placeholders::_1); 
    c(1); 

    c = fn2; 
    c(2); 

    return 0; 
} 

とブースト版(私はそれので、これを使ったことがありません)間違っている可能性があります:

#include <boost/function.hpp> 
#include <iostream> 
typedef boost::function<void(int a)> callback_t; 

class A { 
public: 
    void fn(int a) { std::cout << a << std::endl; } 
}; 

void fn2(int b) { std::cout << a << std::endl; } 

int main() { 
    A a; 
    callback_t c = boost::bind(&A::fn, a, boost::placeholders::_1); 
    c(1); 

    c = fn2; 
    c(2); 

    return 0; 
} 
+0

help =) –

+0

typedef宣言でこのコンパイラエラーが発生しました:エラー: '<'トークン前に期待される初期化子 –

+0

どのコンパイラを使用していますか? g ++の場合は、-std = C++ 0xを渡します。 – Naddiseo

4

はい。このような変数は、関数ポインタ(非メンバ関数または静的メンバ関数の場合)またはメンバ関数へのポインタ(非静的メンバ関数の場合)と呼ばれます。

また、Boost、C++ TR1、およびC++ 11はすべてa polymorphic function wrapperを提供します。これは、基本的に柔軟性があり汎用性の高いジェネリック関数ポインタ型です。

+1

"ポインタ"ありがとうございます! –

4

これは、関数へのポインタができることです。

int max(int v1, int v2) { return (v1 > v2) ? v1 : v2; } 
int min(int v1, int v2) { return (v1 < v2) ? v1 : v2; } 
int add(int v1, int v2) { return v1 + v2; } 
int (*function)(int, int) = add; 

int x = function(1, 3); // x == 4 
function = min; 
int y = function(1, 3); // x == 1 

あなたはC++でメンバ関数へのポインタをも得ることができます。表記法は若干異なります。あなたは、コード表記を使用して関数へのポインタを経由して機能を呼び出す表示される場合があり

function = max; 
int z = (*function)(1, 3); // x == 3 

これは昔ながらの、事前に標準℃である。しかし、それは明確な関数へのポインタが使用されていることになり(私はまだそれが好きで、しばしばそれを使用します)。

+0

お返事ありがとうございます! –

0

他の回答に加えて、あなたは、関数呼び出し演算子を定義することにより、機能のような(あるいはオーバーロードされた関数のセットのような)任意のユーザー定義型の行為のオブジェクトを作ることができます。

class MyClass 
{ 
public: 
    MyClass(): member(42) {}; 
    void operator()(int i) { std::cout << (member=i) << '\n'; } 
    void operator()() { std::cout << member++ << '\n'; } 
private: 
    int member; 
}; 

int main() 
{ 
    MyClass foo; 

    foo(); // prints 42 
    foo(); // prints 43 
    foo(23); // prints 23 
    foo(); // prints 24 
} 
関連する問題