std::tuple 型があり、文字列をその要素の 1 つに逆シリアル化できるかどうかを確認する必要があります。要素のインデックスと文字列は、実行時にのみわかります。
私のソリューション(以下)はほとんど機能しますが、を使用するとコンパイラエラーが発生しstd::tuple_element
、次のようになります。
エラー: 不完全な型 'struct std::tuple_element<0ul, std::tuple&> の無効な使用
#include <sstream>
#include <tuple>
template<class Tuple, std::size_t N>
struct IsDeserializable {
static void check(std::size_t idx, std::stringstream& in) {
IsDeserializable<Tuple, N-1>::check(idx, in);
if (idx == N-1) {
typename std::tuple_element<N-1,Tuple>::type tmp;
in >> tmp;
}
}
};
template<class Tuple>
struct IsDeserializable<Tuple, 1> {
static void check(std::size_t idx, std::stringstream& in) {
if (idx == 0) {
typename std::tuple_element<0,Tuple>::type tmp;
in >> tmp;
}
}
};
template<class Tuple>
bool is_deserializable(std::size_t idx, const std::string& val) {
std::stringstream in;
in << val;
try {
IsDeserializable<Tuple, std::tuple_size<Tuple>::value>::check(idx, in);
return true;
}
catch(...) {return false;}
}
// Example Usage
std::tuple<int,double,char> MyTuple;
assert(is_deserializable<MyTuple>(0,"4"));
assert(is_deserializable<MyTuple>(1,"56.5"));
assert(is_deserializable<MyTuple>(2,"h"));
assert(!is_deserializable<MyTuple>(0,"4.3"));
assert(!is_deserializable<MyTuple>(1,"Hello"));
assert(!is_deserializable<MyTuple>(2,"42"));