2015-11-02 8 views
5

को छोड़कर एक फ़ाइल संरचना है जहां निश्चित लंबाई तारों का पिछला शून्य नहीं है। शून्य अनुगामी बिना std :: सरणी के रूप में क्षेत्रों को प्रारंभ करने के लिए:एक std :: array <char, N> को प्रारंभिक स्ट्रिंग के साथ प्रारंभिक ' 0'

#pragma pack(push, 1) 
struct Data { 
    // Compiles, but it has an undesired '\0': 
    std::array<char, 6> undesired_number{"12345"}; 
    // Does not compile: 
    std::array<char, 5> number{"12345"}; // stripping '\0' 
}; 
#pragma pack(pop) 
+0

संकलक त्रुटि क्या है बनाना? असंगत प्रकार? मुझे डर है कि चरित्र चरित्र स्ट्रिंग के आधार पर यह संभव नहीं है। –

+3

इसे प्रारंभ करने के लिए आपको स्ट्रिंग अक्षर का उपयोग क्यों करना है? – Barmar

+0

@Barmar बस सुविधा –

उत्तर

11

एक सहायक समारोह

template <std::size_t N, std::size_t ... Is> 
std::array<char, N - 1> to_array(const char (&a)[N], std::index_sequence<Is...>) 
{ 
    return {{a[Is]...}}; 
} 

template <std::size_t N> 
std::array<char, N - 1> to_array(const char (&a)[N]) 
{ 
    return to_array(a, std::make_index_sequence<N - 1>()); 
} 

और फिर

struct Data { 
    std::array<char, 5> number{to_array("12345")}; // stripping '\0' 
}; 

Demo

+0

मुझे आश्चर्य है कि अगर यह शाब्दिक की एक प्रति, या दो, टर्मिनेटर के साथ एक और एक के बिना में संकलित कर देगा। – luk32

+0

@ luk32, कंपाइलर और अनुकूलन सेटिंग्स पर निर्भर करता है। उदाहरण के लिए, O3 के साथ g ++ में कोई शाब्दिक नहीं है। – SergeyA

+0

'make_index_sequence' प्राप्त करने के बाद C++ 11 के साथ अच्छी तरह से काम करता है और 'std :: array संख्या = to_array (" 12345 ") में बदल रहा है; ' –

0

एक स्ट्रिंग शाब्दिक , NUL-समाप्त सी में है ++ (सी के विपरीत) आप नहीं एक Length - 1 आकार प्रदान करके इसे उतार कर सकते हैं; इसलिए यह सीधे नहीं किया जा सकता है, यह भी मानते हैं कि array आंतरिक रूप से T[N] है।

+0

मानक की आवश्यकता नहीं है कि 'आंतरिक array' हो कर सकता है एक 'टी [N]'। कुछ लोग सोचते हैं कि होना चाहिए, मामलों 'N के लिए> 0' वैसे भी –

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