当我显式实例化模板时,如何将 pimpl 用于模板类?
我只需要一个示例代码。
我试过的是:
// MyTemplatedClass.h
template< class T >
class MyTemplatedClass
{
private:
class Impl;
Impl* _pimpl;
public:
void PublicMethod();
}
我的实现是这样的:
// MyTemplatedClass.cpp
template< class T >
class MyTemplatedClass<T>::Impl
{
public:
void PublicMethod();
}
template <class T>
void MyTemplatedClass<T>::Impl::PublicMethod()
{
...
}
将方法调用转发给实现类:
template< class T >
void MyTemplatedClass<T>::PublicMethod()
{
_pimpl->PublicMethod();
}
显式实例化: 使用 int 和 double 的示例:
template class MyTemplatedClass< int >;
template class MyTemplatedClass< double >;
但是好像不行。
最佳答案
这会回答您的问题,但我怀疑它能否达到您希望实现的目标。我怀疑您想要在 MyTemplatedClass 的范围之外声明模板实现。从模板实现继承而不是将其作为成员变量可能是更好的设计。
如果您的编译器不支持 extern 模板声明,我看不出有一个指向实现的模板指针会增加任何值(value)。毕竟,无论如何,您都必须拥有想要隐藏在头文件中的实现细节。
#include <iostream>
template < class T > class MyTemplatedClass {
private:
template < class U> class Impl {
public:
void ImplPublicMethod() {
std::cout << "Standard implementation" << std::endl;
}
};
Impl<T> * _pimpl;
public:
MyTemplatedClass() : _pimpl(new Impl<T>) { }
~MyTemplatedClass() { delete _pimpl; }
void publicMethod() {
_pimpl->ImplPublicMethod();
}
};
template<> class MyTemplatedClass<int> {
private:
class Impl {
public:
void ImplPublicMethod() {
std::cout << "Integer specialisation" << std::endl;
};
};
Impl * _pimpl;
public:
MyTemplatedClass() : _pimpl(new Impl) { }
~MyTemplatedClass() { delete _pimpl; }
void publicMethod() {
_pimpl->ImplPublicMethod();
}
};
int main(int argc, char ** argv) {
MyTemplatedClass<char> charVersion;
charVersion.publicMethod();
MyTemplatedClass<int> intVersion;
intVersion.publicMethod();
return 0;
}
关于c++ - 将 pimpl 与模板类和显式实例化模板一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18203693/