c++ - 具有模板功能的跨平台类

标签 c++ qt function class templates

我目前有两个不同的 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.cppheader_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::stringint 模板参数。因此,您必须为将在模板中使用的每个 typename 编写一个定义,否则您将遇到链接器错误。这显然会降低解决方案的可扩展性,但如果只有几个可能的模板参数,那么它应该是可以接受的。

关于c++ - 具有模板功能的跨平台类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44486860/

相关文章:

C++ 和 WinApi - 使用 GetWindowText() 获取 C++ 代码的参数

qt - QT 更新值信号/槽的最佳实践

c++ - 将预构建的 Qt 二进制文件用于 MSVS 2008 和 MSVS 2010

c - 函数地址一致?

c++ - Func A 调用 Func B,反之亦然(为什么它不起作用)

javascript - 我正在尝试通过 IsFormDisplayed 函数切换 boolean 值

c++ - 这是什么错误: "no appropriate default constructor available"?

c++ - Koenig 查找的基本原理

c++ - 为什么 nullptr 在 C++11 中是小写的?

c++ - QT 在运行时更新 Lineedit