2009-04-12 13 views
48

私はいつも、STLアルゴリズムの述語としてローカルに定義されたクラスを使用できないのか疑問に思っています。問題のSTLアルゴリズムでのローカルクラスの使用

:「C++標準では、引数として使用されるローカル型を禁じているためApproaching STL algorithms, lambda, local classes and other approaches、BubbaTは言及がいるという

例コード:

int main() { 
    int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 
    std::vector<int> v(array, array+10); 

    struct even : public std::unary_function<int,bool> 
    { 
     bool operator()(int x) { return !(x % 2); } 
    }; 
    std::remove_if(v.begin(), v.end(), even()); // error 
} 

どこで誰もが知っています標準は制限ですか?ローカルタイプを許可しない理由は何ですか?


EDIT:C++ 11ので、テンプレート引数としての局所的なタイプを使用することが合法です。

答えて

50

明示的にC++ 98/03標準で禁止されています。

C++ 11この制限を削除してください。

は、より完全なものにするには:テンプレートパラメータとして を使用しているタイプの

制限はC++ 03(と Cの記事14.3.1で を記載されています++ 98)標準:

ローカル・タイプ、無結合を有するタイプ、 名前タイプまたはタイプ を使用してはならないこれらのタイプのいずれかから を配合しました テンプレートタイプパラメータのテンプレート引数として使用します。本日述べた制限は標準が速く進化した場合はすぐに固定されていたであろう間違いだった、まとめるとhttp://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=420

...

template <class T> class Y { /* ... */ }; 
void func() { 
     struct S { /* ... */ }; //local class 
     Y<S> y1; // error: local type used as template-argument 
     Y< S* > y2; // error: pointer to local type used as template-argument } 

ソースと詳細一般的なコンパイラの最後のバージョンでは、ラムダ式の提供に加えて、それが可能です。

+0

私は知っていますが、私は理由を理解できるかどうかを知りたいと思います。標準への参照がありますか? –

+0

14.3.1.2「テンプレート型引数」を参照していますか? – greyfade

+0

私はいくつかの情報と役に立つかもしれないリンクを追加しました。 要約すると、標準が速く進化していた場合、制限は間に合うでしょう... – Klaim

5

制限は「0x」で削除されますが、あなたはあまり使用しないと思います。そしてそれはC++ - 0xがlambdaを持つためです! :)

int main() { 
    int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 
    std::vector<int> v(array, array+10); 

    std::remove_if(v.begin() 
       , v.end() 
       , [] (int x) -> bool { return !(x%2); }) 
} 

上記の私の構文は完全ではないかもしれませんが、一般的な考え方があります。

+0

私はラムダについて知っていた。実際、私が達成したかったのは、現在の標準に可能な限り近いことです。 Javaが提案するソリューションの種類。 –

+0

そして、これは実際の質問に対する答えです(4つの議決権のあるものはもちろんです)。 –

+0

@ChristianRau:;)私はあなたがこれを言う理由を見ることができます。問題はなぜ彼らが許可されておらず、答えの最初の行がこれに対処しているかということです。それは削除されているので、制限の正当な理由はなかったはずです。当時、ラムダは言及する価値があると私は明確に思った。 3年後にラムダはよく知られているので、もはやニュースではありません! –