[英]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.cpp和header_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::string
和int
模板參數。 因此,您必須為將在模板中使用的每個typename
編寫一個定義,否則將獲得鏈接器錯誤。 顯然,這會降低解決方案的可伸縮性,但是如果只有幾個可能的模板參數,那么它應該是可以接受的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.