इनलाइनिंग बनाम टेम्पलेट के साथ metaprogramming इसके लायक सरणी तत्वों कॉपी करने के लिए निम्नलिखित की तरह कोड लिखने के लिए है:सी ++
#include <iostream>
using namespace std;
template<int START, int N>
struct Repeat {
static void copy (int * x, int * y) {
x[START+N-1] = y[START+N-1];
Repeat<START, N-1>::copy(x,y);
}
};
template<int START>
struct Repeat<START, 0> {
static void copy (int * x, int * y) {
x[START] = y[START];
}
};
int main() {
int a[10];
int b[10];
// initialize
for (int i=0; i<=9; i++) {
b[i] = 113 + i;
a[i] = 0;
}
// do the copy (starting at 2, 4 elements)
Repeat<2,4>::copy(a,b);
// show
for (int i=0; i<=9; i++) {
cout << a[i] << endl;
}
} //()
या बेहतर एक inlined समारोह का उपयोग करने के लिए है?
पहला दोष यह है कि आप टेम्पलेट में चर का उपयोग नहीं कर सकते हैं।
आपको केवल 'std :: copy' का उपयोग करना चाहिए। आप लगभग निश्चित हो सकते हैं कि * * * कुछ मेटाप्रोग्रामिंग तकनीकों का उपयोग करता है ताकि int arrays के बीच memmove के बीच प्रतिलिपि अग्रेषित किया जा सके। – UncleBens
क्राइस्ट, मैं सी ++ संकलन समय मेटाप्रोग्रामिंग को देखकर अब और समय व्यतीत करने के बजाय 10 जीवनकाल प्रोग्रामिंग प्रोलॉग खर्च करूंगा :(। अगर आपको कुछ कॉपी करना होगा, तो आपको इसकी प्रतिलिपि बनाना होगा, आप सोचकर इसे दूर नहीं कर सकते यह संकलन समय पर सिर्फ इसलिए कि आपको लगता है कि आप उन चरों की पहचान कर सकते हैं जिन्हें कॉपी किया जाएगा –
@ हसन: डेटाटाइप और संरेखण के आधार पर, प्रतिलिपि बनाने के लिए अलग-अलग रणनीतियां उपयुक्त हो सकती हैं, और ऑपरेशन को नाटकीय रूप से गति देना संभव हो सकता है। "सिर्फ एक प्रति" नहीं है। (लेकिन @UncleBens कहते हैं, 'std :: copy' पहले से ही यह करता है) – jalf