簡體   English   中英

具有模板功能的跨平台類

[英]Cross-platform class with template function

我目前有兩個不同的標頭定義相同的類。 它們之間的變化是函數實現和單個變量。

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它實現其貫徹到具體的操作系統功能的普通函數,然后header_linux.cppheader_win32.cpp。

但是,必須在頭文件中實現模板功能。

我可以使用預處理器宏檢查操作系統,並根據該宏使用正確的實現在單個標頭中進行檢查,但是功能很多並且它們的主體很大。

經過大量研究,我發現了PIMPL習慣用法,但實現起來似乎很復雜。

有沒有更好的辦法?

您可以在cpp文件中編寫模板實現,您所要做的就是在cpp文件中的模板實現之后編寫一個顯式的實例化定義。

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

例:

頭文件

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

實現.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編寫一個定義,否則將獲得鏈接器錯誤。 顯然,這會降低解決方案的可伸縮性,但是如果只有幾個可能的模板參數,那么它應該是可以接受的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM