के लिए स्ट्रिंग शाब्दिक उपयोग करने के लिए मैं constexpr
का उपयोग करके int
को const char*
कास्ट करने के लिए कुछ कोड लिखा है और इस तरह मैं एक टेम्पलेट तर्क के रूप में एक const char*
उपयोग कर सकते हैं। यहाँ कोड है:"constexpr" का उपयोग टेम्पलेट पैरामीटर
#include <iostream>
class conststr
{
public:
template<std::size_t N>
constexpr conststr(const char(&STR)[N])
:string(STR), size(N-1)
{}
constexpr conststr(const char* STR, std::size_t N)
:string(STR), size(N)
{}
constexpr char operator[](std::size_t n)
{
return n < size ? string[n] : 0;
}
constexpr std::size_t get_size()
{
return size;
}
constexpr const char* get_string()
{
return string;
}
//This method is related with Fowler–Noll–Vo hash function
constexpr unsigned hash(int n=0, unsigned h=2166136261)
{
return n == size ? h : hash(n+1,(h * 16777619)^(string[n]));
}
private:
const char* string;
std::size_t size;
};
// output function that requires a compile-time constant, for testing
template<int N> struct OUT
{
OUT() { std::cout << N << '\n'; }
};
int constexpr operator "" _const(const char* str, size_t sz)
{
return conststr(str,sz).hash();
}
int main()
{
OUT<"A dummy string"_const> out;
OUT<"A very long template parameter as a const char*"_const> out2;
}
इस उदाहरण कोड में, out
के प्रकार OUT<1494474505>
और की out2
OUT<106227495>
है प्रकार है। इस कोड के पीछे जादू conststr::hash()
है यह constexpr
रिकर्सन है जो FNV Hash function का उपयोग करता है। और इस प्रकार यह कॉन्स char * के लिए एक अभिन्न हैश बनाता है जो उम्मीद है कि एक अद्वितीय है।
- यह एक सुरक्षित दृष्टिकोण का उपयोग करने है:
मैं इस विधि के बारे में कुछ सवाल हैं? या यह दृष्टिकोण एक विशिष्ट उपयोग में एक बुराई हो सकता है? - क्या आप एक बेहतर हैश फ़ंक्शन लिख सकते हैं जो प्रत्येक स्ट्रिंग के लिए कई वर्णों तक सीमित किए बिना अलग पूर्णांक बनाता है? (मेरे विधि में, लंबाई काफी लंबे समय है)
- आपको एक कोड है कि परोक्ष
conststr
के माध्यम सेint constexpr
करने के लिएconst char*
डाले लिख सकते हैं और इस प्रकार हम सौंदर्य की दृष्टि से बदसूरत (और यह भी समय उपभोक्ता)_const
उपयोगकर्ता परिभाषित स्ट्रिंग शाब्दिक की जरूरत नहीं होगी? उदाहरण के लिएOUT<"String">
कानूनी होगा (और पूर्णांक में "स्ट्रिंग" कास्ट करें)।
किसी भी मदद की सराहना की जाएगी, बहुत बहुत धन्यवाद।
मेरा उत्तर आपके प्रश्न 'का समाधान करता है', तो यह रूप में स्वीकार चिह्नित कर सकते हैं? अन्यथा, आप इसे टिप्पणी कर सकते हैं (दोबारा)! – Synxis
ओह, मेरी माफी, मैं हमेशा ऐसा करना भूल जाता हूं :) –