I tried to create a string splitting template like the following, I get errors.
struct splitX
{
enum empties_t { empties_ok, no_empties };
};
template <typename Container>
Container& split(
Container& result,
const typename Container::value_type& s,
typename Container::value_type::value_type delimiter,
splitX::empties_t empties = splitX::empties_ok )
{
result.clear();
std::istringstream ss( s );
while (!ss.eof())
{
typename Container::value_type field;
getline( ss, field, delimiter );
if ((empties == split::no_empties) && field.empty()) continue;
result.push_back( field );
}
return result;
}
This fails with the error from the headline when I’m trying to use it with the vector class like below:
std::getline(myfile,line);
std::vector<std::string> fields;
split(fields,line,' ');
// Test split function
std::cout << line << std::endl;
for(int i = 0; i < fields.size();i++)
std::cout << fields[i];
Ok, Microsoft Visual C++ 2008 doesn’t like your
Container::value_type::value_type.You can use this monstrous construction:
Or, you can do it in STL style:
Or, you can stop pretending to be a template god and write two overloaded functions: