2015-10-24 8 views
6

मुझे पता है कि इसे लागू करने या कंटेनर का उपयोग करने के अन्य तरीके हैं। यह सिर्फ मेरी जिज्ञासा को पूरा करने के लिए है।संदर्भ द्वारा सरणी पास करना - एक बड़े सरणी का सबसेट

void byref(int (&a)[5]); 

int main() 
{ 
    int a[5]; 
    byref(a); 
} 

संदर्भ द्वारा एक सी शैली सरणी गुजर का एक लाभ यह है कि sizeof के रूप में होगा std::end उस पर काम करेंगे, है: मान लीजिए मैं निम्नलिखित कोड है। लेकिन अब यह केवल इस आकार की सरणी पास करना संभव है।

क्या संदर्भ द्वारा इस फ़ंक्शन में एक बड़ी सरणी का सबसेट पास करना संभव है? उदाहरण के लिए, मैं करना चाहता हूं:

int main() 
{ 
    int a[10]; 
    byref(a + 1); 
} 

क्या यह काम करने का कोई तरीका है?

मैं बनाने और चलाने के लिए, VS2015 में होने की उम्मीद मूल्यों दे यह मिल गया, लेकिन निश्चित रूप से कोड बहुत कुशल दिखता है:

byref(reinterpret_cast<int(&)[5]>(*(a + 1))); 
+1

एक 'array_view' का उपयोग करें। –

+1

@ करोलो हॉर्वथ, ओपी जानता है कि इसे लागू करने या कंटेनरों का उपयोग करने के अन्य तरीके हैं। –

+0

С ++ में आप टेम्पलेट्स का उपयोग कर सकते हैं: 'टेम्पलेट शून्य बायफ (int (& a) [N]);' – Constructor

उत्तर

1

मुझे बुरा लपेटकर एक समारोह में डाला देखने का केवल एक विचार है:

#include <iostream> 
#include <cassert> 

void byref(int (&a)[5]) 
{ 
    std::cout << "Hello!" << std::endl; 
} 

template <size_t M, class T, size_t N> 
T (&subarray(T (&a)[N], size_t start))[M] 
{ 
    assert(start < N && start + M <= N); 
    return reinterpret_cast<T(&)[M]>(a[start]); 
} 

int main() 
{ 
    int a[5], b[8]; 
    byref(a); 
    byref(subarray<5>(subarray<6>(b, 0), 1)); 
} 
0

इस प्रोटोटाइप के साथ, मैं कास्टिंग से आगे बढ़ने का एक और तरीका देखने में विफल रहता हूं।

आमतौर पर, मैं इसे भी देखता हूं: byref((int(&)[5])*(b + 5));, लेकिन निश्चित रूप से यह आपके से समान और कम सुरक्षित है।

तो, मुझे ऐसा करने के लिए कोई स्पष्ट और सुंदर तरीका नहीं दिख रहा है (मैक्रो शायद) को छोड़कर। हालांकि, यह देखने के लिए कि क्या आप यहां कुछ खो रहे हैं, मैं आपके प्रश्न को उखाड़ फेंक दूंगा!

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