Sie können ein Objekt nicht gleichzeitig zurückgeben und erwarten, dass der Aufrufer seinen Typ nicht kennt. Die typische Art, den realen Typ eines Objekts zu "verstecken", besteht darin, es hinter einer Schnittstelle zu verstecken.
Zum Beispiel möchten Sie vielleicht so etwas schreiben:
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++;
}
};
Dann können Sie jede Vorwärtssequenz zurück, wie:
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()
)
);
}
};
Und wie nutzen so:
std::unique_ptr< Cursor<int> > cursor = foo.values();
while (cursor->has_result()) {
std::cout << cursor->get_result() << std::endl;
}
Was meinst du mit "scheint nicht zu funktionieren"? Bitte sei präziser. – larsmoa
Können Sie Code anzeigen? Es ist schwer zu erraten, was in Ihrer Beschreibung falsch ist – plaisthos