從'現代C++設計'的以下技術,我正在實現一個具有各種編譯時優化的持久性庫。我想派遣功能,模板化的成員變量的能力,如果該變量從給定的類派生:基於編譯時類型的調度
template<class T, template <class> class Manager = DefaultManager> class Data
{
private:
T *data_;
public:
void Dispatch()
{
if(SUPERSUBCLASS(Container, T))
{
data_->IKnowThisIsHere();
}
else
{
Manager<T>::SomeGenericFunction(data_);
}
}
}
凡SUPERSUBCLASS是一個編譯時宏來確定對象繼承。當然,在所有T從Container繼承的情況下(或者T是一個內部類型等),這都會失敗,因爲編譯器會正確地抱怨IKnowThisIsHere()不是數據成員,即使這條代碼路徑永遠不會被遵循,如T = int預處理後所示:
private:
int *data_;
public:
void Dispatch()
{
if(false)
{
data_->IKnowThisIsHere();
編譯器明顯抱怨此代碼,即使它永遠不會執行。使用的dynamic_cast的建議也不起作用,因爲再次類型轉換試圖在編譯時這是不可能的(例如使用T =雙,的std :: string):
void Dispatch()
{
if(false)
{
dynamic_cast<Container*>(data_)->IKnowThisIsHere();
error: cannot dynamic_cast '((const Data<double, DefaultManager>*)this)->Data<double, DefaultManager>::data_' (of type 'double* const') to type 'class Container*' (source is not a pointer to class)
error: cannot dynamic_cast '((const Data<std::string, DefaultManager>*)this)->Da<sttad::string, DefaultManager>::data_' (of type 'struct std::string* const') to type 'class Container*' (source type is not polymorphic)
我真的需要模擬(或確實勸說!)如果T從Container繼承,則編譯器發出一組代碼;如果不從Container繼承,則編譯器發出一組代碼。
有什麼建議嗎?
感謝長久 - 這正是我之後。 – user23167 2008-09-28 16:07:10