2015-09-02 32 views
5

विफल रहता है मैं एकाधिक पैरामीटर पैक को सीधे विस्तारित करने का एक तरीका बनाने की कोशिश कर रहा हूं। मैंने एक फ़ंक्शन template<size_t X,typename F> auto sequenceFunc(F&& f) बनाया है, जो एक f को विस्तारित integer_sequence के साथ दिए गए फ़ंक्शन को कॉल करता है।सी ++: लैम्ब्डा के अंदर पैरामीटर पैक विस्तार

यह इस तरह छोटे कार्यों के लिए अच्छी तरह से काम करता है:

template<typename T, 
     size_t A,size_t B> 
vec<B,T> col(const mat<A,B,T>& a,const size_t& i){ 
    return sequenceFunc<A>([&](auto... J) -> vec<B,T>{ 
     return { a[J][i]... }; //expands to a[0][i], a[1][i], ... a[A-1][i] 
    }); 
} 

दुर्भाग्य से मैं कई पैरामीटर पैक विस्तार कर सकते हैं नहीं है, भले ही मैं नियम का पालन, कि केवल एक पैरामीटर पैक एक ... -expression अंदर हो सकता है। ,

error: parameter packs not expanded with '...': 
     auto i = I; 
      ^

मैं सच में समझ में नहीं आता क्यों एक विस्तार के लिए आवश्यक है क्योंकि वहाँ बाहर एक और ...:

template<typename S,typename T, 
     size_t A,size_t B,size_t C> 
mat<C,B,S> mul(const mat<A,B,S>& a,const mat<C,A,T>& b){ 
    return sequenceFunc<B>([&](auto... I)->mat<C,B,S>{ //for all B rows in a... 
     return { 
      sequenceFunc<C>([&](auto... J)->vec<C,S>{ // ... look at all C columns in b and calculate dot product. 
       auto i = I; //putting "I" outside the expansion of "J" 
       return { 
        dot(row(a,i),col(b,J))... //expands J 
       }; 
      })... //expands I 
     }; 
    }); 
} 

यह त्रुटि है: इस मैट्रिक्स गुणन के लिए इस समारोह का उपयोग करने में मेरी प्रयास है भाव। मैं जीसीसी 5.1.0 का उपयोग करता हूं।

सूचनाvec और matstd::array के लिए केवल using -declarations और एक नेस्टेड std::array<std::array<A,T>,B>

+5

जीसीसी में लैम्बडास में पैक के साथ समस्याएं हैं। –

+0

@ टी.सी. बगजिला लिंक? – Mgetz

उत्तर

4

यह gcc bug 47226 है कर रहे हैं। यह अभी भी खुला है, और कोड उदाहरण अभी भी जीसीसी 5.2.0 पर विफल रहता है, जबकि यह क्लैंग 3.6 पर ठीक है। आपका कोड मेरे लिए सही दिखता है।

+0

यह एक भयानक 'print_all' है? यह ऑर्डर * से बाहर प्रिंट करता है। – Yakk

+0

@Yakk एचएम। मैं स्पष्ट रूप से लैम्ब्डा के साथ ऐसा करने के तरीके पर खाली हूं। क्या ऐसा करने का कोई तरीका नहीं है? – Barry

+0

'टेम्पलेट शून्य do_each (F && ... f) {(शून्य) int [] {0, (std :: आगे (f)(), शून्य(), 0) ...}; } ', फिर' do_each ([&] {std :: cout << t << '\ n';} ...); 'print_all' में। लैम्ब्डा का उपयोग कार्यों को पैकेज करने के लिए किया जाता है, प्रारंभकर्ता सूची को क्रम में निष्पादित करने के लिए उपयोग किया जाता है। लम्बाडा के रूप में 'do_each' लिखना छोड़कर (आसान, लेकिन क्यों?), "लैम्ब्डा के रूप में विस्तार" को कैसे न करें। – Yakk

0

मुझे अभी भी एक ही समस्या का सामना करना पड़ा। एक बेहतर डुप्ली नहीं मिला और एक नया प्रश्न नहीं खोलना चाहता था, लेकिन फिर भी मेरे निष्कर्ष साझा करना चाहते हैं। एक समान प्रश्न पर एक टिप्पणी में मुझे एक वर्कअराउंड मिला जो पैरामीटर को टुपल में रखता है और फिर इसे लैम्ब्डा के अंदर अनपैक करता है (क्षमा करें अब लिंक नहीं ढूंढें)। हालांकि, उस समाधान के लिए सी ++ 17 (std::apply और अधिक) की आवश्यकता होती है।

struct Foo{ 
    template <typename T,typename ...ARGS> 
    void foo(T t,ARGS...args){ 
    auto x = [&](){ t(args...);} 
    } 
}; 

जो जीसीसी 4.8.5 के साथ काम नहीं कर रहा:

मेरे मामले कुछ इस तरह था। ,

template <typename T,typename ...ARGS> 
struct FooFunct{ 
    void operator()(T t,ARGS...args){ 
    t(args...); 
    }  
}; 

struct Foo{ 
    template <typename T,typename ...ARGS> 
    void foo(T t,ARGS...args){ 
    auto x = FooFunct<T,ARGS...>(); 
    } 
}; 

मैं यह थोड़ा अजीब लगता है कि जीसीसी स्वैलोज़ इस, जबकि नहीं पहले एक: मेरे आश्चर्य करने के लिए बस को स्पष्ट रूप से बाहर लैम्ब्डा लेखन के रूप में functor एक आकर्षण की तरह काम करता है। अफैक लैम्बदास फ़ंक्शन स्कोप पर अज्ञात फ़ैक्टर के लिए सिंटैक्टिक चीनी हैं। शायद कंपलरों पर मेरा ज्ञान यह समझने के लिए बहुत छोटा है कि इस बग को ठीक करने में समस्या क्या है।

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