5

मैं निम्नलिखित टेम्पलेट का एक उदाहरण में एक सी ++ शाब्दिक स्ट्रिंग परिवर्तित करने के लिए कोशिश कर रहा हूँ:संकलन समय शाब्दिक स्ट्रिंग

template <char ... C> 
struct string_literal { 
    typedef string_constant type; 
    static constexpr const char value[sizeof...(C)] = {C...}; 
    constexpr operator const char* (void) const { 
     return value; 
    } 
}; 
template <char ... C> 
constexpr const char string_literal<C...>::value[sizeof...(C)]; 

मैं इन सहायकों के साथ 'खोल' के लिए विभिन्न स्रोतों के आधार पर आया उपरोक्त टेम्पलेट में उद्धृत स्ट्रिंग मान।

template <unsigned N, const char (&S) [N], typename U> 
struct selector; 

template <unsigned N, const char (&S) [N], unsigned ...I> 
struct selector<N, S, index_sequence<I...>> { 
    using type = string_literal<S[I]...>; 
}; 

template <unsigned N, const char (&S) [N]> 
struct unpack { 
    using type = typename selector<N, S, make_index_sequence<N>>::type; 
}; 

हालांकि, जब एक कॉल इस मैं एक संकलक त्रुटि मिलती है:

जीसीसी 4.9+ रिपोर्ट: त्रुटि: 'स्थिरांक चार (& रों) [1]' मान्य नहीं है प्रकार के लिए टेम्पलेट तर्क 'स्थिरांक चार (&) [1]' क्योंकि संदर्भ चर एक निरंतर पता

बजना 3.7.1 रिपोर्ट नहीं है: त्रुटि: गैर-प्रकार का टेम्पलेट तर्क उस ऑब्जेक्ट को संदर्भित करता है जिसमें लिंक

मैंने कुछ अलग दृष्टिकोणों की कोशिश की लेकिन त्रुटियां अधिकतर समान हैं। मुझे यहां क्या याद आ रही है?

+1

आप जीएनयू एक्सटेंशन का उपयोग कर सकते हैं ([उदाहरण] (https://github.com/tomilov/parser_generator/blob/master/src/main.cpp#L29))। वर्तमान में यह एकमात्र तरीका सोचने योग्य है। – Orient

+0

वैकल्पिक-संतोषजनक- समाधान जो जीसीसी और क्लैंग के तहत संकलित करता है: http://ideone.com/uKP2qj –

+0

'(शून्य)' सी-izm है। 'ऑपरेटर कॉन्स char * 'वर्तमान में गलत है (त्रुटि-प्रवण): आपको' मान 'के मूल्य को' मान [आकार ... (सी)] = {सी ...};' से 'मान [ आकार ... (सी) + 1] = {सी ..., '\ 0'}; ', क्योंकि वर्तमान में इसकी शुद्धता स्रोत चार सरणी के अधिग्रहण के तरीके पर निर्भर करती है। – Orient

उत्तर

1

क्या यह आपकी आवश्यकताओं को पूरा करने के लिए एक संतोषजनक समाधान है?

template <char ... C> 
struct string_literal { 
    static constexpr const char value[sizeof...(C)] = {C...}; 
    constexpr operator const char* (void) const { 
     return value; 
    } 
    void foo() {std::cout << value << '\n';} 
}; 
template <char ... C> constexpr const char string_literal<C...>::value[sizeof...(C)]; 

template <typename CharT, CharT... Cs> 
constexpr string_literal<Cs...> operator ""_create() { 
    return {}; 
} 

int main() { 
    string_literal<'t','e','s','t'> s = "test"_create; 
    std::cout << s << '\n'; // test 
    s.foo(); // test 
} 
+1

की एक डुप्ली है, दूसरों की टिप्पणियों के मुताबिक, यह एक जीएनयू एक्सटेंशन (कॉन्स्टेक्स उपयोगकर्ता-परिभाषित अक्षर) पर निर्भर करता है जो न तो वर्तमान या अगले का हिस्सा है सी ++ मानक (अब तक): http://cplusplus.github.io/EWG/ewg-active.html#66 –

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