2012-02-03 25 views
0

C++では、ローカル関数またはファンクタをグローバル関数に渡すことは全く不可能ですか?すべての記号が「いいえ」を指しているようです。これは積分器のような簡単な数学関数の実装を解決する最も簡単な方法のようです:ローカル関数をパラメータとしてグローバル関数に渡す

template<class integrand> 
void integrate(integrand f) { 
    ... 
    f(); 
    ... 
} 

int main() { 
    struct twofer { 
     int operator()(int i) const { return 2*i; } 
    }; 

    integrate(twofer()); 
} 

またはそのようなものです。これは、ローカルオブジェクトをテンプレートに渡すことができないために失敗します。私は新しい標準がラムダ関数をここで使うことを許していることは知っていますが、今は新しい標準を使うことができません。私は本当に関数がローカルで宣言されることを本当に望んでいます。なぜなら、特にプロキシのための実際のコードでは、物を読みやすくすると思うからです。私は、クラスまたは構造体に完全な関数を入れることができることを知っていますが、やはり読みやすさを損なうと思います。選択肢はありますか?

+0

私は、無名関数が唯一のC++ 11でサポートされているので、あなたは、「正常な機能」を構築する必要があります怖いhttp://en.wikipedia.org/wiki/Anonymous_function #C.2B.2B – Vyktor

+1

ローカルパラメータをテンプレートパラメータとして使用する*も* C++ 11で動作します。構造体をmainの外側の匿名の名前空間に置くことを除いて、古い標準の実際の回避策はありません。 –

答えて

1

メンバ関数へのポインタを使用できますが、関数は静的でなければなりません。それは私の作品:

#include <iostream> 

using namespace std; 
typedef int (*Integrand)(int i); 

int integrate(Integrand f) { 
    return f(2)+f(3)+f(4); 
} 

int main() { 

    struct Twofer { 
     static int function(int i){return 2*i;} 
    } t; 

    cout << integrate (t.function) << "\n"; 
    return 0; 
} 
0

オブジェクトとクラスを混同しています。ローカルに宣言されたクラスを使用してテンプレートオブジェクトをインスタンス化することはできません。

ローカル機能が何を意味するのかよくわかりません。 C++にはローカル関数のようなものはありません。あなたのコードから。ローカルに定義されたクラスのオブジェクトのファンクタを呼び出すことを止めるものは何もありません。しかし、それを使ってテンプレートをインスタンス化することはできません。

これはC++ 11で変更されているかどうかわかりません。

関連する問題