#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 और अंग्रेजी के गैर देशी वक्ता, और संशोधन या प्रश्न का सुझाव के रूप में लंबे समय के रूप मूल इरादा आरक्षित है का स्वागत किया है!)
http://stackoverflow.com/a/7808401/493106 – xaxxon