Я наткнулся на следующую проблему при разработке «общего» читателя:
Следующий код работает отлично (вам нужна поддержка С++ 1z для компиляции, поскольку он использует constexpr if, но с небольшими изменениями он также должен компилироваться с С++ 11):
#include <vector>
#include <string>
#include <type_traits>
#include <tuple>
#include <sstream>
using namespace std;
template<int N, class tuple_type>
struct fill_tuple {
static void write(std::vector<std::string>& container, tuple_type& tuple)
{
// use operator >> to fill the N-1'th member of the tuple
std::stringstream(container[N - 1]) >> std::get<N - 1>(tuple);
if constexpr(N > 1){ // Continue if there are till fields to read
fill_tuple<N - 1, tuple_type>::write(container, tuple);
}
}
};
template<class tuple_type>
void read (std::vector<std::string>& container, tuple_type obj){
fill_tuple<std::tuple_size<tuple_type>::value, tuple_type>::write(container, obj);
}
struct some_data {
char a;
char b;
char c;
char d;
auto content() {
return std::tie(a,b,c,d);
}
};
int main()
{
std::vector<std::string> some_strings = {"a","b","c","d"};
// Read some_strings into some_data
some_data foo;
read(some_strings, foo.content());
}
Для простоты любые связанные проверки (такие как tuple_size ‹= размер контейнера) опущены.
Если бы я хотел разобрать структуру, которая имеет только элементы a, b и d, используя контейнер размером 4, моя интуиция заключалась в том, чтобы просто переписать std::tie(a,b,c,d)
в std::tie(a,b,std::ignore,d)
.
Это, однако, терпит неудачу, поскольку std::ignore
(или реализация gcc), похоже, не имеет функции operator>>
. Я уже пытался проверить std::ignore
с помощью std::is_same
: std::is_same<typename std::remove_reference<typename std::tuple_element<N - 1,tuple_type>::type>::type, std::ignore>::value
, но это тоже не помогло.
Мой вопрос: есть ли способ проверить std::ignore или, что еще лучше, полностью заменить его, не полагаясь на предыдущие модификации вектора контейнера?
std::ignore
подобен объекту, а не типу. Попробуйте поставитьdecltype
вокруг него. - person Incomputable   schedule 15.12.2017std::vector<std::string> container
. То есть я не хочу просто удалять элемент 'c' изsome_strings
в данном примере. - person patrick Klein   schedule 15.12.2017