Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 具有模板功能的跨平台类_C++_Qt_Function_Class_Templates - Fatal编程技术网

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

C++ 具有模板功能的跨平台类,c++,qt,function,class,templates,C++,Qt,Function,Class,Templates,我目前有两个不同的头定义同一个类。它们之间的变化是函数实现和单个变量 header\u linux.h class Class { private: QStringList processesList; // Same variable pid_t pid; // Different variable public: void fillProcessesList() { // Different implementation }

我目前有两个不同的头定义同一个类。它们之间的变化是函数实现和单个变量

header\u 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
    }
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
    }
template <typename T>
bool readMemory(unsigned long long address, T &destination);
类
{
私人:
QStringList processesList;//相同的变量
pid\u t pid;//不同的变量
公众:
void fillProcessesList()
{
//不同的实现
}
void isProcessRunning(QString名称)
{
//相同的实现
}
模板
bool readMemory(无符号长地址,T和目标)
{
//不同的实现
}
头文件\u win32.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
    }
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
    }
template <typename T>
bool readMemory(unsigned long long address, T &destination);
类
{
私人:
QStringList processesList;//相同的变量
句柄;//不同的变量
公众:
void fillProcessesList()
{
//不同的实现
}
void isProcessRunning(QString名称)
{
//相同的实现
}
模板
bool readMemory(无符号长地址,T和目标)
{
//不同的实现
}
我希望在一个文件中包含公共变量和函数

我的想法是创建定义类及其成员的header.h,实现常用函数的header.cpp,然后创建实现操作系统特定函数的header\u linux.cppheader\u win32.cpp

但是,必须在头文件中实现模板函数

我可以使用一个预处理器宏来检查操作系统,并据此使用正确的实现,在一个标题中,但是函数很多,它们的主体很大

经过大量研究,我发现了PIMPL习惯用法,但实现似乎很复杂


有更好的方法吗?

您可以在
cpp
文件中编写模板实现,您所要做的就是在
cpp
文件中的模板实现之后编写一个显式的实例化定义

例如:

标题.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
    }
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
    }
template <typename T>
bool readMemory(unsigned long long address, T &destination);
模板
bool readMemory(无符号长地址,T和目的地);
实现。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);
模板
bool readMemory(无符号长地址,T和目标)
{
//实施
}
//明确定义
模板bool readMemory(无符号长地址,std::string&destination);
模板bool readMemory(无符号长地址、int和destination);

在本例中,您只能将
readMemory
std::string
int
模板参数一起使用。因此,您必须为模板中使用的每个
typename
编写定义,否则将出现链接器错误。这显然会降低解决方案的可扩展性,但是,如果只有几个可能的模板参数,那么它应该是可以接受的。

值得一提的是,
Pimpl
是我读了前几句话后想到的第一个想法。你应该将操作系统特定的东西包装成一个非泛型函数,并与之交互。据我所知,操作系统不做模板b但是实现似乎很复杂。你一定是读错了源代码。使用PIMPL没有什么复杂的地方(至少对我来说)。虽然我从20世纪80年代初开始编程。Qt本身在内部使用PIMPL——有关如何使用PIMPL宏以及内置于Qt中的此类宏的详细信息,请参阅。我通过使用Qt的PIMPL和我需要的类型的显式实例化解决了我的问题,目前只有两种类型。