2015-11-07 13 views
10

Czy istnieje sposób na zastosowanie klauzuli generalnej wymaga do argumentów funktora lambda?Jak używać klauzuli require z argumentami funktora lambda?

Załóżmy, że mam dwa ograniczenia C1 i C2, które chcę sprawdzić przeciwko argument. Liczyłam następujące pracować ponieważ podobna składnia jest dozwolona dla funkcji:

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

ale to won't compile z GCC 6

+0

Dlaczego nie można po prostu napisać normalnego funktor? – inf

+4

The Concepts TS nie modyfikuje gramatyki lambd, więc myślę, że nie jest możliwe dodanie klauzuli require do lambda. Zmieniając definicję * specyfikatora typu prostego *, można użyć specyfikatorów typu ograniczonego jako parametrów. – dyp

Odpowiedz

5

moim skromnym zdaniem i na podstawie Concepts TS§5.1.4/C4 Wymaga wyrażenia [expr.prim.req] (podkr):

wymaga ekspresja powinna pojawić się jedynie w ramach koncepcji defin (7.1.7) lub w klauzuli wymagającej deklaracji wzoru (klauzula 14) lub deklaracji funkcji (8.3.5).

Powyższy cytat specjalnie dyktuje konteksty gdzie mogą pojawić się requires klauzula i lambda nie jest jednym z nich.

Concequently,

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

jest nieprawidłowy.

Jednak w §5.1.2 wyrażeń lambda [expr.prim.lambda] jest następujący przykład:

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

Więc sądzę, można osiągnąć to, co chcesz w następujący sposób:

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

Tak, wygląda na to, że to prawda. Znalazłem ten wątek w grupie pojęć, która odnosi się do tego samego [pytania] (https://groups.google.com/a/isocpp.org/forum/?fromgroups#!topic/concepts/4WraUOsevH8). To niefortunne, ponieważ istnieje wiele przypadków, w których zwięzła składnia pojęć nie jest wystarczająca do wyrażenia wymaganego ograniczenia. Mamy nadzieję, że zostanie to uwzględnione w przyszłym projekcie. – rnickb

+0

Dobrze - mam świadomość zwięzłej składni pojęć. Nadal jest to IMO defekt, który musiałbyś zdefiniować zupełnie nową koncepcję, jeśli masz bardziej skomplikowaną klauzulę wymaga. Co więcej, ta składnia nie zadziała, jeśli masz pojęcie, które musi odwoływać się do wielu argumentów. – rnickb

+0

@rnickb w oparciu o opublikowany link, którego nie ma na liście priorytetów Adrew Shutton "Zwiększenie lambdas nie było wysoko na liście priorytetów (lambdy mają sprawić, że kod będzie krótszy).". Zgadzam się z tym. Lambda rzeczywiście ma skrócić kod. Z drugiej strony to, co mówisz, jest prawdą, kompozycja pojęć dla osiągnięcia tego, czego chcesz, w pewien sposób zaciemnia bazę kodu. Sądzę, że zobaczymy w przyszłości, co się stanie :). – 101010

Powiązane problemy