2013-06-04 22 views
0

有誰知道任何將讀取/寫入csv並取決於地圖(可能嵌套)傳遞以推斷類型和填充地圖的庫或示例。根據地圖類型C++解析和轉換csv

這可能會涉及一些遞歸模板代碼。

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

我不認爲這是你目前的方式feasable。你到目前爲止發現了哪些不適合你的需求? –

+0

我已經爲單個(不是嵌套的)地圖推出了自己的閱讀器。 準備爲每種地圖結構寫入讀/寫, 但是希望找到更通用的東西 – Bloogle

+0

這是泛化使得它很難,但你可以希望模板功能的編程-C++大師。 –

回答

0

這就是我想出了

#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是模板參數的上限容許限制。這種模式在boost庫中非常常見。 –

+0

偉大的這應該有所幫助。 – Bloogle