2012-02-29 4 views
0

C로 구현 된 변형 유형에 대한 C++ 11 래퍼 작업 중입니다. 변형 유형은 int, float, string과 같은 공통 데이터 유형을 지원하지만 튜플도 지원합니다. 양식의 기본 유형에 대한 변환기가 있습니다.변종 배열을 std :: tuple로 변환

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

...하지만 표준 변환으로 고생하고 있습니다.

기본 C API는 변형의 배열을 반환하여 튜플을 구분할 수 있습니다.

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

지금 내가 수동으로 튜플의 각 크기에 대한 템플릿을 만들 수 있습니다 인식,하지만 난 튜플의 크기를 처리 할 수있는 가변 솔루션을 찾고 있어요 : 그것은 다음과 같은 형태. 이 접근하는 방법에 대한 모든 정보?

BTW, 포장하려고하는 실제적인 것은 Erlang NIF API입니다.

+3

이 튜플의 개념은 쉽게 'std :: tuple'에 매핑됩니까? 컴파일 시간이 아닌 런타임에 해당 아키텍처가 사용 가능한 것으로 보입니다. 알려진 수와 작은 수의 수의 가능한 경우, 당신은 타입 - 지우기 수있는이 밖으로,하지만 그 유형에 대한 최종 인터페이스는'std :: tuple'처럼 보이지 않을 것입니다. –

+0

Variant 튜플 유형이 std :: tuple 유형과 일치하지 않으면 예외가 발생합니다. – goertzenator

답변

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에 대해 templatized되고, do_it는 Ts에 templatized ...). 나를 올바른 방향으로 인도 해 주셔서 감사합니다. – goertzenator