我目前有两个不同的 header 定义同一个类。它们之间的变化是函数实现和单个变量。
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
}
我希望将公共(public)变量和函数放在一个文件中。
我的想法是创建定义类及其成员的header.h,实现常用功能的header.cpp,然后是header_linux.cpp 和 header_win32.cpp 实现操作系统特定的功能。
但是,模板函数必须在头文件中实现。
我可以使用预处理器宏检查操作系统,并根据它在单个 header 中使用正确的实现,但函数很多,主体也很大。
经过大量研究,我找到了 PIMPL 惯用语,但实现起来似乎很复杂。
有没有更好的办法?
最佳答案
您可以在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);
实现.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
编写一个定义,否则您将遇到链接器错误。这显然会降低解决方案的可扩展性,但如果只有几个可能的模板参数,那么它应该是可以接受的。
关于c++ - 具有模板功能的跨平台类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44486860/