2014-06-11 32 views
6

我想在編譯時換一個可變參數模板的兩個參數:如何在編譯時交換可變參數模板的兩個參數?

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 ::數組在編譯時?

+0

入住這https://github.com/Manu343726/Turbo/blob/reboot/bind.hpp – Manu343726

+0

像'INT swapped_arr [] = {unswapped_arr [N == swap_pair :: First? swap_pair :: Second:N == swap_pair :: Second? swap_pair :: First:N] ...};'你有一個未打開元素的數組;你也可以使用一個'integer_sequence'和'get (seq)'函數。 – dyp

+1

[Live example](http://coliru.stacked-crooked.com/a/df8eac60c18156bc) – dyp

回答

5

我發表在評論上的鏈接是我自己實現的一個std::bind()類似元功能的函數。

我所做的是將bind調用參數從其值(A值或佔位符)轉換爲值或該佔位符表示的值。

在您的情況下,您可以嘗試類似的方法:將佔位符(傳遞給swap的值)的序列映射到序列的對應值。喜歡的東西:

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類似於std::transform()一元函數(很容易寫),以及get它檢索序列的第i個元素(一件容易的事)一元函數。

這可能對這種方式使用:

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

@dyp謝謝。永遠不要用iPad寫答案...... – Manu343726

相關問題