2010-08-16 9 views
8

हे सब, मैं वर्तमान में एक संकलन-समय स्ट्रिंग एन्क्रिप्शन लिखने की कोशिश कर रहा हूं (शब्द 'स्ट्रिंग' और 'एन्क्रिप्शन' शब्द का उपयोग करके काफी हद तक) lib।वैराइडिक टेम्पलेट्स के साथ संकलन-समय 'स्ट्रिंग' मैनिपुलेशन

// Cacluate narrow string length at compile-time 
template <char... ArgsT> 
struct CountArgs 
{ 
template <char... ArgsInnerT> struct Counter; 

template <char Cur, char... Tail> 
struct Counter<Cur, Tail...> 
{ 
    static unsigned long const Value = Counter<Tail...>::Value + 1; 
}; 

template <char Cur> 
struct Counter<Cur> 
{ 
    static unsigned long const Value = 1; 
}; 

static unsigned long const Value = Counter<ArgsT...>::Value; 
}; 

// 'Encrypt' narrow string at compile-time 
template <char... Chars> 
struct EncryptCharsA 
{ 
static const char Value[CountArgs<Chars...>::Value + 1]; 
}; 

template<char... Chars> 
char const EncryptCharsA<Chars...>::Value[CountArgs<Chars...>::Value + 1] = 
{ 
Chars... 
}; 

हालांकि मैं समझ नहीं कैसे पात्रों पर कार्रवाई करने के रूप में मैं उन्हें स्थिर सरणी में विस्तार:

मैं अब तक क्या किया है इस प्रकार है। मैं बस प्रत्येक चरित्र पर एक सरल ऑपरेशन निष्पादित करना चाहता हूं (उदा। '(((सी^0x12)^0x55) + 1)' जहां सी चरित्र है)।

सही दिशा में एक झुकाव की सराहना की जाएगी।

धन्यवाद सब कुछ।

+0

आप एक दे सकता है उदाहरण के लिए ऊपर दिए गए कार्यों के साथ आप इसका उपयोग कैसे करना चाहते हैं? – David

+0

चार const const * const pfooEnc = EncryptCharsA <'F','o','o'> :: मान; – RaptorFactor

उत्तर

4

तुम सिर्फ एक समय अपनी आसान में एक चरित्र पर काम करना चाहते हैं:

template<char c> struct add_three { 
    enum { value = c+3 }; 
}; 

template <char... Chars> struct EncryptCharsA { 
    static const char value[sizeof...(Chars) + 1]; 
}; 

template<char... Chars> 
char const EncryptCharsA<Chars...>::value[sizeof...(Chars) + 1] = { 
    add_three<Chars>::value... 
}; 

int main() { 
    std::cout << EncryptCharsA<'A','B','C'>::value << std::endl; 
    // prints "DEF" 
} 

ध्यान दें कि CountArgs अनावश्यक है (कि क्या sizeof... के लिए है) और इस element-wise transformation of the elements in a parameter-pack का उपयोग करता है।


बनाने के परिवर्तन पिछले परिणामों पर निर्भर है, एक ही विकल्प, रिकर्सिवली पात्रों का उपभोग करने के एक बार में एक होगा, और संवर्द्धित कि से एक नया टेम्पलेट का निर्माण:

template<char... P> struct StringBuilder { 
    template<char C> struct add_char { 
     typedef StringBuilder<P..., C> type; 
    }; 

    static const char value[sizeof...(P)+1]; 
}; 

template<char... P> const char StringBuilder<P...>::value[sizeof...(P)+1] = { 
    P... 
}; 

template<class B, char...> struct EncryptImpl; 

template<class B, char Seed, char Head, char... Tail> 
struct EncryptImpl<B, Seed, Head, Tail...> { 
    static const char next = Head + Seed; // or whatever 
    typedef typename EncryptImpl< 
     typename B::template add_char<next>::type, 
     next, Tail... 
    >::type type; 
}; 

template<class B, char Seed> struct EncryptImpl<B, Seed> { 
    typedef B type; 
}; 

template<char... P> struct Encrypt { 
    typedef typename EncryptImpl<StringBuilder<>, 0, P...>::type type; 
}; 
+0

धन्यवाद। आखिरकार मैं इसे अधिक जटिल एल्गोरिदम का उपयोग करके संचालित करने के लिए विस्तारित करना चाहता था (यानी।अगले चरित्र के 'एन्क्रिप्शन' के लिए पिछले 'ऑपरेशन' के परिणामस्वरूप 'बीज' के रूप में उपयोग करना)। क्या यह भी संभव है, या मुझे एक-चरित्र समाधान के साथ रहना होगा? संपादित करें: बस आपके समाधान बीटीडब्ल्यू का परीक्षण किया और यह काम किया! इसके बारे में अभी भी उत्सुक है कि इसे अधिक जटिल एल्गोरिदम का उपयोग करके कार्यान्वित करना संभव है या नहीं। – RaptorFactor

+0

@ रैप्टर: एचएम, इसके बारे में सोच रहा है। –

+0

यह एक मजेदार समस्या है।^_^ – RaptorFactor

1

अगर मैं समझता हूं कि आप सही तरीके से क्या करना चाहते हैं (वास्तव में संकलन समय पर एक सरणी बनाएं) मुझे लगता है कि विविधता टेम्पलेट पर्याप्त नहीं हैं और आपको constexpr के लिए प्रतीक्षा करनी होगी।

हालांकि आप एक वास्तविक सरणी की जरूरत नहीं है और इसके बजाय कुछ tuple के get<I> तो यह संभव है के लिए समान का उपयोग कर पर समझौता कर सकते हैं (आप तो रनटाइम पर एक char सरणी का निर्माण कर सकते हैं) है।

+0

आह बेशक, मैंने इसके बारे में नहीं सोचा था। हां, व्यक्तिगत रूप से 'एन्क्रिप्टेड' वर्णों से रनटाइम पर स्ट्रिंग का निर्माण अब के लिए एक स्वीकार्य समाधान है। जब तक वर्णों का वास्तविक हेरफेर संकलन समय पर होता है जो बहुत अच्छा होगा। धन्यवाद! – RaptorFactor

+0

उह, यह सामान आपके सिर को पहले पाने के लिए इतना कठिन है। मुझे नहीं पता कि लोग कुछ टीएमपी-भारी libs को कैसे बनाए रख सकते हैं (आपको बूस्ट देख रहे हैं!: पी)। – RaptorFactor

+0

क्या आप कृपया उदाहरण दे सकते हैं कि मैं रनटाइम पर स्ट्रिंग कैसे बनाऊंगा? मैंने 'get' फ़ंक्शन जोड़ा है और इसे एक चरित्र-दर-चरित्र आधार पर काम कर लिया है, लेकिन क्योंकि यह एक टेम्पलेट है, मैं इसे लूप में फेंक नहीं सकता और रनटाइम पर स्ट्रिंग का निर्माण कर सकता हूं। मैं इस बारे में उलझन में हूं कि मुझे इसे पूरी तरह से मैन्युअल रूप से करने के लिए कैसे करना है (i.g. प्रत्येक वर्ण के लिए मैन्युअल रूप से कॉल करना <> और मैन्युअल रूप से इसे मेरी स्ट्रिंग में जोड़ना)। मैं सही दिशा में एक और धक्का की सराहना करता हूं, मैं इन सभी चीजों के लिए काफी नया हूं। धन्यवाद। :) – RaptorFactor

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