這就是我想出了
#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
我不認爲這是你目前的方式feasable。你到目前爲止發現了哪些不適合你的需求? –
我已經爲單個(不是嵌套的)地圖推出了自己的閱讀器。 準備爲每種地圖結構寫入讀/寫, 但是希望找到更通用的東西 – Bloogle
這是泛化使得它很難,但你可以希望模板功能的編程-C++大師。 –