Вы не можете одновременно возвращать объект как есть и ожидать, что вызывающий абонент не узнает его тип. Типичный способ «скрыть» реальный тип любого объекта - скрыть его за интерфейсом.
Например, вы можете захотеть, чтобы написать что-то вроде этого:
template<typename T>
class Cursor
{
public:
typedef T value_type;
virtual ~Cursor() {}
virtual bool has_result() = 0;
virtual value_type get_result() = 0;
};
// implements cursor interface for any sequence
// described as a pair of forward iterators.
template<typename I>
class ForwardSequenceCursor :
public Cursor<std::iterator_traits<I>::value_type>
{
I myCurrent;
const I myEnd;
public:
ForwardSequenceCursor(I begin, I end)
: myCurrent(current), myEnd(end)
{}
virtual bool has_result() {
return myCurrent != myEnd;
}
virtual value_type get_result() {
return *myCurrent++;
}
};
Затем, вы можете вернуть любой прямой последовательности, как:
class Foo
{
std::vector<int> myValues;
public:
std::unique_ptr< Cursor<int> > values() {
return std::unique_ptr< Cursor<int> >(
new ForwardSequenceCursor<vector<int>::const_iterator>(
myValues.begin(), myValues.end()
)
);
}
};
И использовать его так:
std::unique_ptr< Cursor<int> > cursor = foo.values();
while (cursor->has_result()) {
std::cout << cursor->get_result() << std::endl;
}
Что значит «не работает»? Пожалуйста, уточните. – larsmoa
Можете ли вы показать код. Трудно догадаться, что случилось с вашим описанием – plaisthos