Ich bin von diesem Problem mit C++ - Vorlagen verwirrt.Referenzieren Typ in verschachtelten C++ - Vorlagen
Ich habe eine Klasse weiter unten definiert:
template <class T>
class DataConsumer
{
public:
DataConsumer() : processCount(0)
{}
~DataConsumer()
{}
// Sub classes override this in order to do their thing
void preConsume()
{
std::cout << "Preconsume called" << std::endl;
processCount++;
}
virtual void consume(const T *dataSource)
{
preConsume();
}
private:
long long processCount; // The bare bones template keeps track of the number of data frames it has consumed
};
Die DataConsumer Vorlage einen Typ Datasource zu übernehmen soll. DataSource ist selbst ein komplexer Typ;
template <class T>
class DataSource
{
public:
// C-tor and D-tor
DataSource() : currentFrame(new T)
{}
// Note that this is a weak assignment as the data
// is not copied; the pointers are merely set to the
// existing frames properties
DataSource(T& existingFrame) : currentFrame(new T)
{
currentFrame->frame = existingFrame.frame;
currentFrame->meta = existingFrame.meta;
}
~DataSource()
{}
// Update function. Specializations expand on this
void update()
{}
// Return a const pointer to something (the data source can be an image frame, textual, binary etc.)
const T * getCurrentDataFrame() const
{
const T * const frame_ptr = currentFrame.get(); // Just return an unmodifiable pointer
return frame_ptr;
}
void echo()
{
// Generic data source just prints its current frame
std::cout << currentFrame->frame << currentFrame->meta << std::endl;
}
private:
boost::shared_ptr<T> currentFrame; // The actual data frame object
};
Mein Problem ist folgendes: es ist auch mit einem anderen Parameter als Templat Bedeutung Ich möchte in die DataConsumer Klasse die zugrunde liegende Template-Parameter des Datasource-Objekt abzufragen. Zum Beispiel arbeitet der Code-Snippet fein:
virtual void consume(const T *dataSource)
{
preConsume();
std::cout << dataSource->getCurrentDataFrame()->toString() << std::endl; // This WORKS!
}
Was will ich wirklich, ist die Art zurück von getCurrentDataFrame() erhalten wird:
virtual void consume(const T *dataSource)
{
preConsume();
INSERT_TYPE_HERE * frame = getCurrentDataFrame();
std::cout << frame->toString() << std::endl; // How do I do this?
}
Kann mir jemand bitte helfen Sie mit der Syntax erforderlich?
'INSERT_TYPE_HERE * frame = getCurrentDataFrame();' - sollte das 'dataSource-> getCurrentDataFrame();' wie in Ihrem "Arbeits" -Beispiel sein? – WhozCraig
Nein; Das ist genau meine Frage. Ich möchte eine lokale Variable deklarieren, anstatt jedes Mal dataSource-> getCurrentDataFrame() zu schreiben. – Lancophone
Sie können in der DataSource einen typedef deklarieren, der den Vorlagenparametertyp darstellt (types technics). Oder wenn in C++ 11 ein 'declltype'-Konstrukt verwendet wird. Sie können auch die 'consume'-Methode erstellen und den Template-Parameter abfangen. –