2016-07-23 85 views
0

我可能会使它比它需要更混乱,但我想弄清楚什么是最好的做法是在处理模板并传递它们时参考。传递变量的指针作为基于模板的参数

我有一个叫做IOQueue的类模板。我在main中创建了一个IOQueue<std::string>。我想传递一个指向另一个将与所述队列交互的类的指针。以下是我在寻找:

的main.cpp

IOQueue<std::string> *DecompressLogQueue; 

int main(int argc, char** argv) 
{ 
    CompressFile cp(DecompressLogQueue); 
    cp.Compress(9); 

    return 0; 
} 

现在,这是我有点迷茫......在我CompressFile类,是有一个更清洁,更合乎道德的方式来传递这个指针?这就是我现在所看到的。

CompressFile::CompressFile(IOQueue<std::string> *DecompressLogQueue) 
{ 
    CompressFile::DecompressLogQueue = DecompressLogQueue; 
} 

如果我继承了我在CompressFile IOQueue模板,像这样

class CompressFile : public IOQueue<string> 
{ 
... 

不能做我沿着

CompressFile::CompressFile(const T& DecompressLogQueue) 

行我知道这可能不会编译东西。如果你想构造函数

class CompressFile 
{ 
    public: 
    template<typename T> 
    CompressFile(IOQueue<T>* DecompressLogQueue) 
    { 
     // Will accept a pointer to an IOQueue with any template parameter. 
     // ... 
    } 

    // ... 
}; 

感谢

+0

这里有问题吗? –

回答

1

如果你想CompressFile的构造函数只需要IOQueue<T>*类型,其中T是非特异性的参数,你可以使用这个采取任何模板类型的参数,其中有一个模板参数,您可以使用此:

class CompressFile 
{ 
    public: 
    template<template<typename> class T, typename TParam> 
    CompressFile(T<TParam>* DecompressLogQueue) 
    { 
     // Will accept a pointer to any class with one template parameter. 
     // ... 
    } 

    // ... 
}; 

如果你想要更复杂的东西,你可能需要使用更复杂的模板魔法,可能涉及<type_traits>的一些助手。

请注意,在这两种情况下,只有构造函数本身需要模板化; CompressFile不需要任何模板参数就可以工作。


现在,话虽如此,让我们看看你的其他问题:

在我CompressFile类,是有一个更清洁,更合乎道德的方式来传递这个指针?

您可以尝试传递引用而不是指针,或传递智能指针而不是原始指针。

template<template<typename> class T, typename TParam> 
CompressFile::CompressFile(T<TParam>& DecompressLogQueue); 

// .... 

IOQueue<std::string> DecompressLogQueue; 

int main(int argc, char** argv) 
{ 
    CompressFile cp(DecompressLogQueue); 
    // The compiler will handle the pointer syntax for you. 
} 

如果我继承了我的CompressFile模板IOQueue像这样

class CompressFile : public IOQueue<string> 
{ 
... 

不能做我沿着

CompressFile::CompressFile(const T& DecompressLogQueue) 

线的东西不幸的是,据我所知, C++缺乏简单的语法,关键字或标准化的宏来使用像父类那样的类型s o你仍然需要输入。如果您想缩短名称,请尝试使用typedef

typedef IOQueue<std::string> IOQSS; 

CompressFile::CompressFile(const IOQSS& DecompressLogQueue); 

如果这不是你问什么,请你澄清你的问题?