2013-06-04 4 views
0

csv를 읽고 쓸 수있는 모든 라이브러리 또는 예제를 알고 있고 유형을 추론하고지도를 채우는 (잠재적으로 중첩 된)지도에 따라 다른 사람이 알고 있습니까?지도 유형을 기반으로 csv 구문 분석 및 캐스팅 C++

여기에는 재귀 템플릿 코드가 포함됩니다.

map<int, map< double, map< string, double > > > 는 형식 123,93.003, BLAH의 CSV, 42.24

또는 map<Date, map< string, vector<double> > > // arbitary length vector (1)/1/2013 년 , BLAH, 0.1,0.2,0.3,0.4을 기대 ..... 0.99

감사합니다.

+0

해낸거야. 지금까지 찾은 것이 당신의 필요에 맞지 않는 무엇입니까? –

+0

하나의 (중첩되지 않은) 맵에 대해 독자를 굴렸습니다. 지도 유형의 각 유형에 대해 읽기/쓰기를 작성하려고했으나 더 일반적인 것을 찾고 싶었습니다 – Bloogle

+0

일반화로 인해 어려워졌습니다. 그러나 템플릿 기능 프로그래밍 -C++ 전문가를 기대할 수 있습니다. –

답변

0

여기에 내가이 당신이 그것을 제시하는 방식에 feasable 생각하지 않습니다

#include <iostream> 
#include <algorithm> 
#include <iterator> 
#include <tuple> 
#include <typeinfo> 

using std::tuple; 
using std::get; 

template< class... Args > 
struct parser; 

// Specialization for std::tuple 
template< class... Args > 
struct parser<tuple<Args...>> { 
    typedef tuple<Args...> tuple_type; 

    static tuple_type parse(std::istream& is) { 
     tuple<Args...> result; 
     _parse<0, tuple_type>::parse(is, result); 
     return result; 
    } 

private: 
    template< size_t N, class T > 
    struct _parse; 

    template< size_t N, class A0, class... An > 
    struct _parse<N, tuple<A0, An...>> { 
     static void parse(std::istream& is, tuple_type& t) { 

     std::cout << "Enter " << typeid(A0).name() << ": "; 
     if (!(is >> get<N>(t))) 
     { std::cout << "Bad input!\n"; is.clear(); } 
     is.get(); 

     // Recurse on the rest of the list 
     _parse<N+1, tuple<An...>>::parse(is, t); 
     } 
    }; 

    // Termination 
    template< size_t N > 
    struct _parse<N, tuple<>> { 
     static void parse(std::istream& is, tuple_type& t) { 
     /* */ 
     } 
    }; 
}; 

int main() { 
    typedef tuple<int, double, char> tuple_type; 
    tuple_type t = parser<tuple_type>::parse(std::cin); 

    std::cout << get<0>(t) << ", " << get<1>(t) << ", " << get<2>(t) << std::endl; 
} 

출력

$ ./a.out 
Enter i: 0 
Enter d: 0.0 
Enter c: w 
0, 0, w 


$ ./a.out 
Enter i: 0 
Enter d: 0.0 
Enter c: w 
0, 0, w 
+0

니스가 잘 작동하는 것처럼 보입니다. 불행히도 나는 가변성 템플릿을 사용할 수 없습니다. 어떻게 접근 할 것인가에 대한 다른 생각은 없습니까? – Bloogle

+1

그러면 1 arg 대 N args의 경우를 처리하는 파서 전문화가 필요합니다. 여기서 N은 템플릿 인수의 허용 가능한 최대 한도입니다. 이 패턴은 부스트 ​​라이브러리에서 매우 일반적입니다. –

+0

위대한 도움이 될 것입니다. – Bloogle