2015-11-07 2 views
10

ラムダファンクタの引数に一般的なrequires節を適用する方法はありますか?ラムダファンクタ引数にrequires句を使用するには?

引数に照合してチェックしたい2つの制約C1C2があるとします。私は似た構文が機能するために許可されているので、次のように動作するように期待されるだろう:私の愚見ではGCC 6

+0

は、なぜあなたは普通のファンクタを書きませんか? – inf

+4

概念TSはlambdaの文法を変更しないので、lambdaにrequire節を追加することはできないと思います。 * simple-type-specifier *の定義を変更することで、制約型指定子をパラメータとして使用することができます。 – dyp

答えて

5

[](auto x) requires C1<decltype(x)> && C2<decltype(x)> { 
    // ... 
} 

しかし、このwon't compileをしてConcepts TS§5.1.4/ C4に基づいて必要式は[expr.prim.req]強調鉱山):

Aのみコンセプトdefin内に表示されなければなら-expressionが必要です(7.1.7)、またはテンプレート宣言 (箇条14)または関数宣言(8.3.5)の要求節内に記述することができます。

上記の引用は、具体的requires句が表示されることが文脈を指示し、ラムダはその一つではありません。

Concequently、

[](auto x) requires C1<decltype(x)> && C2<decltype(x)> { 
    // ... 
} 

は有効ではありません。 5.1.2ラムダ式[expr.prim.lambda]でしかし

次の例があります:

template<typename T> concept bool C = true; 
auto gl = [](C& a, C* b) { a = *b; }; // OK: denotes a generic lambda 

だから私は、あなたが以下のようにしたいものを達成でき、推測:

template <class T> concept bool C1 = true;           
template <class T> concept bool C2 = true; 
template <class T> concept bool C3 = C1<T> && C2<T>; // Define a concept that combines 
                // `C1` and `C2` requirements.     

int main() {                  
    auto f = [](C3 x) { /* Do what ever */ }; // OK generic lambda that requires input 
              // argument satisfy `C1` and `C2`                               
} 

Live Demo

+0

はい、そうですね。私は、同じ[質問](https://groups.google.com/a/isocpp.org/forum/?fromgroups#!topic/concepts/4WraUOsevH8)に対処するコンセプトグループでこのスレッドを見つけました。簡潔な概念構文が必要な制約を表現するのに十分でない場合が多いので、残念です。うまくいけば、これは将来の草案で取り上げられるでしょう。 – rnickb

+0

右 - 私は簡潔な概念の構文を知っています。それでもIMOの欠点は、複雑なrequire節がある場合は、全く新しい概念を定義する必要があるということです。さらに、複数の引数を参照する必要がある概念がある場合、その構文は機能しません。 – rnickb

+0

あなたが投稿したリンクに基づいて@rnickbはAdrew Shuttonの優先順位リストにはありません "ラムダを大きくすることは優先順位のリストには高くありませんでした(ラムダはコードをもっと短くすることになっています)。私はちょっとそれに同意する。 Lambdaは実際にコードを短くすることになっています。一方、あなたが言っていることは、あなたが望むものを達成するためのコンセプトの構成であり、ちょっとコードベースをやや難解にしています。私たちは将来何が起こるか見るでしょう:)。 – 101010

関連する問題