2010-10-06 17 views
8

पता नहीं है कि क्या संभव है, मैं शायद data[n] या data[n][n][n] प्राप्त करना चाहता हूं। सी हो सकता है में (मुझे ठीक कर लें गलत):डी समारोह में ... के सरणी के सरणी प्राप्त करें?


void save_data(void* arr, int n, int dimensions) 
{ 
    // do ugly things 
} 

लेकिन डी में एक और अधिक सुरुचिपूर्ण तरीका मौजूद होना चाहिए सी शैली सूचक arithmetics का उपयोग कर के अलावा

उत्तर

8

एक वैकल्पिक safe_data टेम्पलेट, यानी इस तरह कुछ करने के लिए है :

import std.stdio; 
import std.traits; 

void safe_data(T)(in T arr) { 
    static if(isArray!T) { 
     writeln("Length ", arr.length); // do some ugly stuff for whole array 
     foreach(e; arr) safe_data(e); // recursively go deeper 
    } else { 
     writeln("Element ", arr);  // do more ugly stuff on individual elements 
    } 
} 

void main() { 
    writeln("A"); 
    int[3] A = [1,2,3]; 
    safe_data(A); 
    writeln("B"); 
    int[3][2] B = [[1,2,3],[4,5,6]]; 
    safe_data(B); 
} 

क्या आप डेटा के साथ क्या करना चाहते हैं पर निर्भर करता है, तो आप in पर बजाय ref उपयोग करने के लिए चाहते हो सकता है। बीटीडब्ल्यू, यदि आप चाहें, तो आप static if को फ़ंक्शन के बाहर ले जा सकते हैं जो कभी-कभी क्लीनर कोड बनाता है:

// handle arrays 
void safe_data(T)(in T arr) if(isArray!T) { 
     writeln("Length ", arr.length); // do some ugly stuff for whole array 
     foreach(e; arr) safe_data(e); // recursively go deeper 
} 

// handle array elements 
void safe_data(T)(in T e) if(!isArray!T) { 
     writeln("Element ", e);   // do more ugly stuff on individual elements 
} 
+0

बस जो मैं ढूंढ रहा था! मैं अच्छी तरह से टेम्पलेट्स को समझ नहीं पा रहा हूं लेकिन आपका उदाहरण बहुत स्पष्ट है। –

+0

@ पेड्रो: आपका स्वागत है। यदि आप डेटा को क्रमबद्ध करना चाहते हैं, तो ऑरेंज (http://www.dsource.org/projects/orange) एक नज़र के लायक हो सकता है। – stephan

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