给定两个非常相似但行为不同的模板类:
template<class T>
firstBase {};
template<class T>
secondBase {};
现在我有了另一个类,它基于它的模板参数,将派生自firstBase
或派生自secondBase
:
template<class B, class T>
myClass : public B<T> { /* T is used in here */ };
好吧,那是行不通的。编译器告诉我这B
是一个未知的模板名称。( error: unknown template name 'B'
)
我目前的解决方法是定义myClass
为
template<class B, class T>
myClass : public B { /* T is used in here */ };
并且调用者myClass
需要通过myClass<b<t>, t>
而不是myClass<b, t>
.
后者会非常好,并减少一些复制和粘贴代码。有没有其他方法可以实现这一目标?
在我的用例中,我正在尝试deep_const_ptr
为 pimpl idiom 实现一个启用“true constness”的方法。根据是否myClass
需要可复制分配,它要么使用deep_const_ptr<std::shared_ptr>
要么deep_const_ptr<std::unique_ptr>
用于其私有指针。
#include <memory>
#include <iostream>
template<class pointerT, class typeT>
class deep_const_ptr : public pointerT
{
public:
explicit deep_const_ptr(typeT* ptr) : pointerT(ptr) { }
// overloading pointerT::operator->() for non-constant access
typeT* operator->() {
std::cout << "deep_const_ptr::operator->()" << std::endl;
return pointerT::operator->();
}
// overloading pointerT::operator->() for constant access
const typeT* operator->() const {
std::cout << "deep_const_ptr::operator->() const" << std::endl;
return pointerT::operator->();
}
};
编辑因此,正如Luc Danton 在他的回答中
所建议的那样,我最终通过或传递给我的习惯:std::unique_ptr<myClass::Private>
std::shared_ptr<myClass::Private>
deep_const_ptr
template<typename pointerTypeT>
class deep_const_ptr : public pointerTypeT {
explicit deep_const_ptr(typename pointerTypeT::element_type* ptr) : pointerTypeT(ptr);
typename pointerTypeT::element_type* operator->();
const typename pointerTypeT::element_type* operator->() const;
};
deep_const_ptr<std::unique_ptr<Test::Private>> d_unique;
deep_const_ptr<std::shared_ptr<Test::Private>> d_shared;