Почему ostream_iterator необходимо явно объявлять тип объектов для вывода?

В текущем C ++ класс ostream_iterator был разработан следующим образом:

// excerpted from the standard C++

template<class T, ...>
class ostream_iterator
{
public:
    ostream_iterator(ostream_type&);
    ...

    ostream_iterator<T,...>& operator =(const T&);
    ...
};

Для меня этот дизайн неоптимален. Поскольку пользователь должен указать тип T при объявлении ostream_iterator следующим образом: ostream_iterator oi (cout); Фактически, cout может принимать в качестве аргумента любой тип объекта, а не только один тип. Это очевидное ограничение.

// Below is my own version

// doesn't need any template parameter here
class ostream_iterator
{
public:
    ostream_iterator(ostream_type&);
    ...

    // define a template member function which can take any type of argument and output it
    template<class T> 
    ostream_iterator<T,...>& operator =(const T&);
    ...
};

Теперь мы можем использовать его как следует:

ostream_iterator oi(cout);

Я думаю, что это более общий и более элегантный, чем

ostream_iterator<int> oi(cout);

Я прав?

10
задан xmllmx 2 December 2010 в 08:41
поделиться