2012-02-29 102 views
0

我正在使用C實現的變體類型的C++ 11包裝器。變體類型支持像int,float,string這樣的常見數據類型,但也支持元組。我有轉換器的形式的基本類型...將變量數組轉換爲std :: tuple

template<typename T> 
T convert_to(const Variant &var); 

...但我努力轉換爲std ::元組。

底層的C API可以通過返回一個變量數組來分離出一個元組。它看起來是這樣的:

int get_tuple(Variant var, Variant **argv, int *argc); 

現在我意識到我可以手動元組的每個大小創建模板,但我要尋找一個可變參數的解決方案,可以處理的元組的任何尺寸。有關如何解決這個問題的任何提示?

順便說一句,我想要包裝的是Erlang NIF API。

+3

這個元組的概念是否容易映射到'std :: tuple'?看起來它的運行時可用,而不是編譯時。如果可能的數量的arities如果已知並且很小,你可以鍵入 - 擦除你的出路,但是該類型的最終接口看起來不像'std :: tuple'。 – 2012-02-29 19:01:45

+0

我打算拋出一個異常如果Variant元組arity不符合std ::元組元組arity。 – goertzenator 2012-02-29 20:24:50

回答

2

由於您使用的是C++ 11(並且您知道模板參數中的元組類型),因此可以愉快地使用可變參數模板。像*

template <class ... Ts> 
std::tuple<Ts...> convert_to(const Variant& v) 
{ 
    Variant tmp_array[std::tuple_size<std::tuple<Ts...>>::value]; 
    get_tuple(v, tmp_array, sizeof(tmp_array)/sizeof(tmp_array[0])); 
    std::tuple<Ts...> ret; 
    array_to_tuple(ret, tmp_array); 
    return ret; 
} 

其中array_to_tuple將複製的元素一一:

template <class ... Ts> 
struct array_to_tupler 
{ 
    template <int I> 
    static void do_it(std::tuple<Ts...> &t, Variant* vs) 
    { 
    std::get<I-1>(t) = convert_to<decltype(std::get<I-1>(t))>(vs[I-1]); 
    do_it<I-1>(t, vs); 
    } 
    template <> 
    static void do_it<0>(std::tuple<Ts...> &t, Variant* vs) 
    { 
    } 
}; 

template <int N, class ... Ts> 
void array_to_tuple(std::tuple<Ts...> &t, Variant (&vs)[N]) 
{ 
    array_to_tupler<Ts...>::do_it<N>(t, vs); 
} 

希望這可以工作...

*)請注意,這樣convert_to不會輕易調用。我建議使用類模板對返回類型進行專門化,因爲您需要部分專業化,哪些功能模板不能擁有。

+0

在模板類中使用函數專用是非法的,但是如果將其從內部翻出(array_to_tupler在int N上模板化,do_it在Ts上模板化),它將起作用。非常感謝您指引我朝着正確的方向發展。 – goertzenator 2012-03-03 20:44:48