2016-10-20 6 views
7
#include <cstdio> 

class builtin_pack 
{ 
    long v[4]; 
public: 
    builtin_pack (long v1, long v2, long v3, long v4) : v{v1, v2, v3, v4} {} 
    void builtin_op() 
    { 
     printf ("%lx,%lx,%lx,%lx\n", v[0], v[1], v[2], v[3]); 
    }; 
    template<typename Func, typename... Targs> 
    void builtin_apply (Func f, Targs ... t) 
    { 
     for (int i = 0; i < 4; i++) 
     { 
      v[i] = f (t.v[i]...); 
     } 
    } 
}; 

class pack : builtin_pack 
{ 
public: 
    pack (long v1, long v2, long v3, long v4) : builtin_pack (v1, v2, v3, v4) {} 
    template<typename Func, typename... Targs> 
    pack& apply (Func f, Targs ... t) 
    { 
     this->builtin_apply (f, t...); 
     return *this; 
    } 
    void op() 
    { 
     this->builtin_op(); 
    } 
}; 

int main() 
{ 
    pack p1{0xff, 0x0f, 0xf0, 0x06}, p2{0x0f00, 0xf000, 0x6700, 0xff00}; 
    pack p3{0x12340000, 0x56780000, 0x45120000, 0xdead0000}; 
    p3.apply ([] (long i, long j, long k)->long{return i | j | k;}, p1, p2, p3); 
    p3.op(); 
    return 0; 
} 

कि कोड एक त्रुटि के साथ संकलित:मैं अपने कार्यान्वयन वर्ग को निजी रखते हुए सी ++ में विविधता टेम्पलेट का उपयोग कैसे कर सकता हूं?

main.cpp:17:24: error: cannot cast 'pack' to its private base class 'builtin_pack' 
      v[i] = f (t.v[i]...); 
        ^
main.cpp:29:15: note: in instantiation of function template specialization 'builtin_pack::builtin_apply<(lambda 
     at main.cpp:42:16), pack, pack, pack>' requested here 
     this->builtin_apply (f, t...); 
      ^
main.cpp:42:8: note: in instantiation of function template specialization 'pack::apply<(lambda at 
     main.cpp:42:16), pack, pack, pack>' requested here 
    p3.apply ([] (long i, long j, long k)->long{return i | j | k;}, p1, p2, p3); 
    ^
main.cpp:22:14: note: implicitly declared private here 
class pack : builtin_pack 
      ^~~~~~~~~~~~ 
main.cpp:17:26: error: 'v' is a private member of 'builtin_pack' 
      v[i] = f (t.v[i]...); 
         ^
main.cpp:22:14: note: constrained by implicitly private inheritance here 
class pack : builtin_pack 
      ^~~~~~~~~~~~ 
main.cpp:5:10: note: member is declared here 
    long v[4]; 
     ^
2 errors generated. 

मुझे क्या करना चाहते हैं एक कस्टम (लैम्ब्डा) समारोह ('लागू करें' कहा जाता है) के साथ एक मानचित्रण विधि लागू करने के लिए है। यह आसानी से काम करता है जब निजी कार्यान्वयन-पब्लिक रैपर का पदानुक्रम अनुपस्थित है, इसलिए जब सरणी v कक्षा pack कक्षा में है, तो यह संकलित और अपेक्षा के अनुसार चलता है। हालांकि, यह तब काम नहीं करता है जब डेटा एक निजी विरासत में संग्रहीत किया जाता है।

कक्षा की संरचना एक रैपर वर्ग के साथ एक निजी कार्यान्वयन वर्ग है, और बीच में मुझे इस त्रुटि का सामना करना पड़ा।

क्या मैंने विविध टेम्पलेट को गलत तरीके से उपयोग किया है? या क्या कोई कामकाज उपलब्ध है?

(मेरे गरीब अभिव्यक्ति के लिए खेद है के रूप में मैं सी में एक नौसिखिया हूँ ++ और stackoverflow और अंग्रेजी के गैर देशी वक्ता, और संशोधन या प्रश्न का सुझाव के रूप में लंबे समय के रूप मूल इरादा आरक्षित है का स्वागत किया है!)

+0

http://stackoverflow.com/a/7808401/493106 – xaxxon

उत्तर

4

आपकी समस्या यह है कि निजी विरासत के साथ, आप pack* से builtin_pack* (pack के बाहर) में परिवर्तित नहीं कर सकते हैं। आप इसे डाली करते हैं, कोड को संकलित करता है, हालांकि मुझे यकीन है कि नहीं कर रहा हूँ अगर यह तुम क्या थे के बाद:

template<typename Func, typename... Targs> 
pack& apply (Func f, Targs ... t) 
{ 
    this->builtin_apply (f, static_cast<builtin_pack&&>(t)...); 
    return *this; 
} 

live demo

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

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