2014-06-11 6 views
6

मैं संकलन समय पर variadic टेम्पलेट के दो पैरामीटर स्वैप करने के लिए कोशिश कर रहा हूँ:संकलन समय पर एक विविध टेम्पलेट के दो पैरामीटर कैसे स्वैप करें?

template<int...Numbers>struct sequence{}; 

template<size_t first,size_t second> 
struct Swap_Pair 
{ 
    const static size_t First = first; 
    const static size_t Second = second; 
}; 

template <int...Numbers,class swap_pair> 
struct Swap_Data 
{ 
    static std::array<int, sizeof...(Numbers)> data_;//How to swap Numbers base on the pair and store it in data_ ? 
}; 

उपयोग के मामले में होना चाहिए:

sequence<1, 2, 3, 4, 5, 6> array; 
auto result = Swap_Data < array, Swap_Pair<2, 5> > ::data_; 
//result is now std::array which contains 1 2 6 4 5 3 

मैं समझ नहीं उचित है क्या Swap_Data लिखने का तरीका।

और मैं परिवर्तनीय पैरामीटर को स्वैप करने और संकलन समय पर std :: array में परिवर्तित करने के लिए एक पुनरावर्ती स्वैप कैसे बना सकता हूं?

+0

चेक इस https://github.com/Manu343726/Turbo/blob/reboot/bind.hpp – Manu343726

+0

कुछ की तरह 'पूर्णांक swapped_arr [] = {unswapped_arr [एन == swap_pair :: पहले? swap_pair :: दूसरा: एन == swap_pair :: दूसरा? swap_pair :: पहला: एन] ...}; 'जहां आपके पास अनचाहे तत्वों की एक सरणी है; आप ' (seq) 'फ़ंक्शंस के साथ कुछ' integer_sequence' का भी उपयोग कर सकते हैं। – dyp

+1

[लाइव उदाहरण] (http://coliru.stacked-crooked.com/a/df8eac60c18156bc) – dyp

उत्तर

5

टिप्पणी पर मैंने जो लिंक पोस्ट किया है वह std::bind() का अपना कार्यान्वयन है-जैसे मेटाफंक्शन के लिए मेटाफंक्शन।

मैंने क्या किया है bind कॉल पैरामीटर को उसके मान (ए मान या प्लेसहोल्डर) से मूल्य में बदलने के लिए, या उस प्लेसहोल्डर द्वारा दर्शाए गए मान को बदलने के लिए।

अपने मामले में आप एक समान दृष्टिकोण का प्रयास कर सकते हैं: प्लेसहोल्डर्स (अनुक्रम में पास किए गए मान) अनुक्रम के अनुक्रमों को अनुक्रमित करें। कुछ की तरह:

template<std::size_t I> 
struct placeholder{}; 

using _1 = placeholder<0>; 
... //More placeholder aliases 

template<typename SEQ , typename... PLACEHOLDERS> 
struct swap; 

template<std::size_t... Is , std::size_t... Ps> 
struct swap<sequence<Is...>,placeholder<Ps>...> 
{ 
    template<typename PLACEhOLDER> 
    struct transformation; 

    template<std::size_t I> 
    struct transformation<placeholder<I>> 
    { 
     static constexpr const std::size_t result = get<sequence<Is...>,I>::value; 
    }; 

    using result = map<transformation,sequence<Is...>>; 
}; 

कहाँ map एक metafunction std::transform() के समान (बहुत आसान लिखने के लिए) है, और get एक metafunction जो (बहुत आसान) एक दृश्य के ith तत्व प्राप्त करता है।

यह इस रास्ते पर इस्तेमाल किया जा सकता:

using swapped = typename swap<sequence<1,2,3>,_3,_2,_1>::result; //swapped is sequence<3,2,1> 
+1

@dyp धन्यवाद। आईपैड के साथ जवाब कभी नहीं लिखें ... – Manu343726

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