2017-06-11 30 views
0

我目前有兩個不同的標題定義相同的類。它們之間的變化是函數實現和單個變量。具有模板功能的跨平臺類

header_linux.h

class Class 
{ 
private: 
    QStringList processesList; // Same variable 
    pid_t pid; // Different variable 

public: 
    void fillProcessesList() 
    { 
      // Different implementation 
    } 

    void isProcessRunning(QString name) 
    { 
      // Same implementation 
    } 

    template<typename T> 
    bool readMemory(unsigned long long address, T &destination) 
    { 
      // Different implementation 
    } 

header_win32.h

class Class 
{ 
private: 
    QStringList processesList; // Same variable 
    HANDLE handle; // Different variable 

public: 
    void fillProcessesList() 
    { 
      // Different implementation 
    } 

    void isProcessRunning(QString name) 
    { 
      // Same implementation 
    } 

    template<typename T> 
    bool readMemory(unsigned long long address, T &destination) 
    { 
      // Different implementation 
    } 

我想有共同的變量和函數在一個文件中。

我的想法是創建header.h定義的類及其成員,header.cpp它實現其實施OS-的常用功能,然後header_linux.cppheader_win32.cpp具體功能。

但是,模板函數必須在頭文件中實現。

我可以使用預處理器宏檢查操作系統,並根據使用正確的實現,在一個頭,但功能很多,他們的身體很大。

經過大量的研究,我發現PIMPL的成語,但實現似乎很複雜。

有沒有更好的方法?

+3

值得一提的是,在閱讀前幾句話後,「Pimpl」是我想到的第一個想法。 –

+1

你應該將你的操作系統特定的東西包裝到一個**非**泛型函數中,並且與之交互。據我所知,操作系統不會執行模板 –

+1

***,但實現看起來很複雜。***您必須閱讀錯誤的來源。使用PIMPL的複雜性很少(至少對我來說)。儘管自20世紀80年代初我開始編程。 – drescherjm

回答

1

您可以在cpp文件中編寫模板實現,您只需在cpp文件中的模板實現之後編寫明確的實例化定義。

http://en.cppreference.com/w/cpp/language/class_template#Explicit_instantiation

實施例:

header.h

template <typename T> 
bool readMemory(unsigned long long address, T &destination); 

implementation.cpp

template <typename T> 
bool readMemory(unsigned long long address, T &destination) 
{ 
    // Implementation 
} 

// Explicit definitions 
template bool readMemory<std::string>(unsigned long long address, std::string &destination); 
template bool readMemory<int>(unsigned long long address, int &destination); 

在這個例子中,您可以使用readMemory只有std::stringint模板參數。因此,您必須爲將在模板中使用的每個typename編寫一個定義,否則您將收到鏈接器錯誤。這顯然降低了解決方案的可伸縮性,但是如果只有少數可能的模板參數,那麼它應該是可以接受的。

+0

我解決了我的問題,通過使用Qt的PIMPL和顯式實例化我需要的類型,現在只有兩種類型。 –