2

好的,這是一個非常困難的問題。根據給定的一組索引獲取參數包的子集

我希望能夠通過選擇給定的一組有效索引的參數類型來獲取參數包的子集,然後使用該參數包作爲函數的參數列表。 IE:

template <size_t... indices_t> 
void func(pack_subset<indices_t..., args_t...>); //incorrect syntax, 
               //not sure how else to write this 
               //args_t is predetermined, this 
               //function is a static member of 
               //a variadic class template 

//For a parameter pack <float, double> and index set 0 
void func(float); // <- result of template 

我可以得到一個單一的索引的類型,但一組索引是有點困難,特別是當該集合是一個可變尺寸的。對於語法是:

pack_index<size_t index_t, typename... args>::type 

也許我可以串一串的這些結合在一起,但我不知道如何去擴大indices_t讓我得到列表中的每個值pack_index。

回答

5

如果您纏繞參數到一個元組,這是很直接:

#include <tuple> 

template <typename T, std::size_t ...Is> 
struct selector 
{ 
    using type = std::tuple<typename std::tuple_element<Is, T>::type...>; 
}; 

例輸入:<int, double, float, char, bool>, 1, 3

#include <iostream> 
#include <demangle.hpp> 

int main() 
{ 
    std::cout 
     << demangle<selector<std::tuple<int, double, float, char, bool>, 1, 3>::type>() 
     << std::endl; 
} 

輸出:

std::tuple<double, char> 

所有您需要do是使用std::tuple<args_t...>,你現在只有args_t...


下面是構建這個想法到的東西就好辦了另外一個設想:

template <typename ...Args> struct selector 
{ 
    using T = std::tuple<Args...>; 

    template <std::size_t ...Is> 
    static void call(typename std::tuple_element<Is, T>::type ...args) 
    { 
     // ... 
    } 
}; 

用法:

selector<int, char, bool, double>::call<0, 2>(1, true); // int, bool 
+0

啊,你能解釋一下在這種情況下使用關鍵字?我從來沒有見過這種方式。 – NmdMystery

+1

@NmdMystery:和'typedef std :: tuple <...>類型'一樣;'。 C++新增功能11。 –

+0

雖然結構模板編譯,但我在實現這個時遇到了一些麻煩。這是我有:'template 無效func(選擇器,indices_t ...>)'這也編譯,我只是不知道如何提供參數,因爲代碼完成是不是真的幫助我在Visual Studio – NmdMystery

相關問題