Как писал @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;
}
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*
: Мы просто используем сам итератор. Обратите внимание, что шаблонный оператор = не перезаписывает встроенный оператор присваивания копии. Это все еще обеспечивается.
Не трудно записать то.
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;
};
я не протестировал это, и существует, вероятно, что-то важные пропавшие без вести, но я думаю, что это - идея.
Вы имеете Повышение в наличии? Раз так Вы могли использовать function_output_iterator, переносящий пустую функцию.
Это не идеально все же. Независимо от того, что итератор, который Вы используете, должен будет все еще создать экземпляр value_type для возврата в операторе*, даже если он затем выбросит его.