2015-11-07 5 views
10

क्या सामान्य रूप से लागू करने का कोई तरीका लैम्बडा मज़ेदार के तर्कों के लिए आवश्यक है?लैम्बडा मज़ेदार तर्कों के साथ आवश्यक क्लॉज का उपयोग कैसे करें?

मान लीजिए मैं दो बाधाओं C1 और C2 है कि मैं एक तर्क के खिलाफ जाँच की चाहते हैं। मैं अपेक्षा की होगी काम करने के लिए एक ऐसी ही वाक्य रचना कार्यों के लिए अनुमति के बाद से किया गया है निम्नलिखित:

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

लेकिन जीसीसी 6

+0

क्यों आप सिर्फ एक सामान्य functor नहीं लिखते? – inf

+4

अवधारणाएं टीएस लैम्बडास के लिए व्याकरण को संशोधित नहीं करती है, इसलिए मुझे लगता है कि लैम्ब्डा के लिए एक आवश्यकता-खंड को जोड़ना संभव नहीं है। * सरल-प्रकार-विनिर्देशक * की परिभाषा को बदलकर, यह बाधाओं के रूप में बाध्य-प्रकार-विनिर्देशकों का उपयोग करने की अनुमति देता है। – dyp

उत्तर

5

मेरी विनम्र राय में साथ इस won't compile और आधारित Concepts TS§5.1.4/सी 4 पर आवश्यक है भाव [expr.prim.req] (जोर मेरा):

एक आवश्यकता है अभिव्यक्ति केवल एक अवधारणा defin के भीतर प्रदर्शित करेगा आयन (7.1.7), या टेम्पलेट-घोषणा (खंड 14) या फ़ंक्शन घोषणा (8.3.5) की आवश्यकता-खंड के भीतर।

उपर्युक्त उद्धरण विशेष रूप से संदर्भों जहां एक requires खंड दिखाई दे सकता है और lambdas उनमें से एक नहीं है तय।

Concequently,

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

मान्य नहीं है।

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

तो मुझे लगता है कि, आप निम्नलिखित तरीके से पूरा कर सकते हैं कि आप क्या चाहते:

हालांकि, §5.1.2 लैम्ब्डा भाव में [expr.prim.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

सही - मैं संक्षिप्त अवधारणा वाक्यविन्यास से अवगत हूं। फिर भी यह आईएमओ एक दोष है कि अगर आपको अधिक जटिल होने की आवश्यकता है तो आपको पूरी तरह से नई अवधारणा को परिभाषित करना होगा। इसके अलावा, यह वाक्यविन्यास काम नहीं करेगा यदि आपके पास ऐसी अवधारणा है जिसे एकाधिक तर्कों का संदर्भ देने की आवश्यकता है। – rnickb

+0

@rnickb आपके द्वारा पोस्ट किए गए लिंक पर आधारित है, यह एड्रू शटन की प्राथमिकताओं की सूची पर नहीं है "प्राथमिकता की हमारी सूची में लैम्बडास बड़ा बनाना अधिक नहीं था (लैम्बडा को कोड कम करना चाहिए)।" मैं इसके साथ सहमत हूं। Lambdas वास्तव में कोड कम करने के लिए माना जाता है। दूसरी तरफ जो आप कह रहे हैं वह सत्य है, जो आप चाहते हैं उसे पूरा करने के लिए अवधारणाओं की रचना, थोड़े कोड कोड को खराब कर देते हैं। मुझे लगता है कि भविष्य में हम देखेंगे कि क्या होता है :)। – 101010

संबंधित मुद्दे