传递变量的指针作为基于模板的参数
问题描述:
我可能会使它比它需要更混乱,但我想弄清楚什么是最好的做法是在处理模板并传递它们时参考。传递变量的指针作为基于模板的参数
我有一个叫做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.
// ...
}
// ...
};
:
感谢
答
如果你想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);
如果这不是你问什么,请你澄清你的问题?
这里有问题吗? –