Я создаю вид istream_iterator
(назовите его my_istream_iterator
), предназначенный для извлечения слов из входного потока. То, как будут обрабатываться слова, извлеченные из итератора, не зависит от того, как слова разграничиваются в потоке, но сами слова могут иметь один из многих форматов. Для этого я хочу, чтобы пользователь мог указать класс политики при создании my_istream_iterator
с использованием входного потока, при этом пользователю не нужно указывать тип класса политики в списке аргументов шаблона итератора. Например, если я хочу выводить записи в CSV-файле в главном порядке строк, я хотел бы иметь возможность сделать что-то вроде этого:
std::ifstream is("words.csv");
// Assume that the_policy_class is used to read a special kind
// of CSV file that deviates from the standard specification.
// I don't want to have to specify the type of the policy class
// used by the iterator; how would I be able to do this? (The
// value_type of `mystream_iterator` is always char*).
my_istream_iterator begin = csv_begin<the_policy_class>(
is, the_policy_class('\t', '\n', 1));
// Default constructor for end-of-stream iterator.
my_istream_iterator end;
std::ostream_iterator<char*> out(std::cout, ", ");
// Print the words, delimited by commas, to stdout.
std::copy(begin, end, out);
Как можно сэкономить пользовательскую форму, указав тип класса политики при создании mystream_iterator
, даже если класс политики внутренне используется итератором? Возможно ли это?
Спасибо за вашу помощь!
<ч />
Если это поможет, определение класса my_istream_iterator
, скорее всего, будет выглядеть примерно так:
template <typename Character, typename CharTraits = std::char_traits<Character>,
typename Distance = std::ptrdiff_t>
class basic_my_istream_iterator : public std::iterator<std::input_iterator_tag,
const Character*, Distance>
{
/* ... */
};
typedef basic_my_istream_iterator<char> my_istream_iterator;
typedef basic_my_istream_iterator<wchar_t> my_wistream_iterator;