2016-07-23 101 views
0

我可能會使它比它需要更混亂,但我想弄清楚什麼是最好的做法是在處理模板並傳遞它們時參考。傳遞變量的指針作爲基於模板的參數

我有一個叫做IOQueue的類模板。我在main中創建了一個IOQueue<std::string>。我想傳遞一個指向另一個將與所述隊列交互的類的指針。以下是我在尋找:

的main.cpp

IOQueue<std::string> *DecompressLogQueue; 

int main(int argc, char** argv) 
{ 
    CompressFile cp(DecompressLogQueue); 
    cp.Compress(9); 

    return 0; 
} 

現在,這是我有點迷茫......在我CompressFile類,是有一個更清潔,更合乎道德的方式來傳遞這個指針?這就是我現在所看到的。

CompressFile::CompressFile(IOQueue<std::string> *DecompressLogQueue) 
{ 
    CompressFile::DecompressLogQueue = DecompressLogQueue; 
} 

如果我繼承了我在CompressFile IOQueue模板,像這樣

class CompressFile : public IOQueue<string> 
{ 
... 

不能做我沿着

CompressFile::CompressFile(const T& DecompressLogQueue) 

行我知道這可能不會編譯東西。如果你想構造函數

class CompressFile 
{ 
    public: 
    template<typename T> 
    CompressFile(IOQueue<T>* DecompressLogQueue) 
    { 
     // Will accept a pointer to an IOQueue with any template parameter. 
     // ... 
    } 

    // ... 
}; 

感謝

+0

這裏有問題嗎? –

回答

1

如果你想CompressFile的構造函數只需要IOQueue<T>*類型,其中T是非特異性的參數,你可以使用這個採取任何模板類型的參數,其中有一個模板參數,您可以使用此:

class CompressFile 
{ 
    public: 
    template<template<typename> class T, typename TParam> 
    CompressFile(T<TParam>* DecompressLogQueue) 
    { 
     // Will accept a pointer to any class with one template parameter. 
     // ... 
    } 

    // ... 
}; 

如果你想要更復雜的東西,你可能需要使用更復雜的模板魔法,可能涉及<type_traits>的一些助手。

請注意,在這兩種情況下,只有構造函數本身需要模板化; CompressFile不需要任何模板參數就可以工作。


現在,話雖如此,讓我們看看你的其他問題:

在我CompressFile類,是有一個更清潔,更合乎道德的方式來傳遞這個指針?

您可以嘗試傳遞引用而不是指針,或傳遞智能指針而不是原始指針。

template<template<typename> class T, typename TParam> 
CompressFile::CompressFile(T<TParam>& DecompressLogQueue); 

// .... 

IOQueue<std::string> DecompressLogQueue; 

int main(int argc, char** argv) 
{ 
    CompressFile cp(DecompressLogQueue); 
    // The compiler will handle the pointer syntax for you. 
} 

如果我繼承了我的CompressFile模板IOQueue像這樣

class CompressFile : public IOQueue<string> 
{ 
... 

不能做我沿着

CompressFile::CompressFile(const T& DecompressLogQueue) 

線的東西不幸的是,據我所知, C++缺乏簡單的語法,關鍵字或標準化的宏來使用像父類那樣的類型s o你仍然需要輸入。如果您想縮短名稱,請嘗試使用typedef

typedef IOQueue<std::string> IOQSS; 

CompressFile::CompressFile(const IOQSS& DecompressLogQueue); 

如果這不是你問什麼,請你澄清你的問題?