Отбрасывание вывода функции, для которой нужен выходной итератор

Как писал @Sotirios Delimanolis, вы даже не можете запустить этот код.

Попробуйте это:

@SuppressWarnings("unchecked")
public <T extends Number> T getSomeValue(boolean tf) {
    T number;
    if (tf) {
        number = (T) new Double(1.0);
    } else {
        number = (T) new Integer(11);
    }
    return number;
}
19
задан 3 revs, 2 users 67% 3 December 2008 в 01:03
поделиться

3 ответа

STL не обеспечивает такой итератор. Но Вы могли кодировать его сами (протестировал тот код):

struct null_output_iterator : 
    std::iterator< std::output_iterator_tag,
                   null_output_iterator > {
    /* no-op assignment */
    template<typename T>
    void operator=(T const&) { }

    null_output_iterator & operator++() { 
        return *this; 
    }

    null_output_iterator operator++(int) { 
        return *this;
    }

    null_output_iterator & operator*() { return *this; }
};

Этому не нужны никакие данные при помощи себя как результат operator*. Результат *it = x; не используется в выходных требованиях итератора, таким образом, мы можем дать ему тип возврата void.

<час>

Редактирование: Давайте войдем как это operator* работы. В Стандарте говорится в [1 113] 24.1.2/1 о требованиях выходного итератора что в обоих этих случаях:

*it = t;
*it++ = t;

, Что результат тех выражений не используется. Это - то, что делает эту работу:

null_output_iterator it;
*it; // returns a null_output_iterator& per definition of the `operator*`.
*it = some_value; // returns void per definition of the templated `operator=`. 

Теперь у нас не должно быть данных, которые мы возвращаем в operator*: Мы просто используем сам итератор. Обратите внимание, что шаблонный оператор = не перезаписывает встроенный оператор присваивания копии. Это все еще обеспечивается.

22
ответ дан 30 November 2019 в 00:35
поделиться

Не трудно записать то.

template<typename T>
class NullOutputIterator
{
public:
    NullOutputIterator() {}
    NullOutputIterator& operator++() { return *this; }
    NullOutputIterator& operator++(int) { return *this; }
    T& operator*() { return m; }
    T* operator->() { return &m; }
private:
    T m;
};

я не протестировал это, и существует, вероятно, что-то важные пропавшие без вести, но я думаю, что это - идея.

4
ответ дан 30 November 2019 в 00:35
поделиться

Вы имеете Повышение в наличии? Раз так Вы могли использовать function_output_iterator, переносящий пустую функцию.

Это не идеально все же. Независимо от того, что итератор, который Вы используете, должен будет все еще создать экземпляр value_type для возврата в операторе*, даже если он затем выбросит его.

3
ответ дан 30 November 2019 в 00:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: