class A : boost::noncopyable {
int type;
A(int type, enum e) : type(type) { /* ... */ }
}
typedef boost::shared_ptr<A> A_ptr;
template <enum VAR>
class B : boost::noncopyable {
static A_ptr x, y;
B() {
if (!x.get()) {
x.reset(new A(0, VAR));
}
if (!y.get()) {
y.reset(new A(1, VAR));
}
}
}
我希望基于模板有几种类型的'B';这样,它将保持单独的静态和“跟踪”他们自己的x
,y
(A_ptrs)。
问题:
a)如何在模板正常工作的情况下将其设置为标头/源配置?
b)我应该形成'createA'功能而不是x.reset(new A(0, VAR));
c)当未初始化时,shared_ptr.get()是否保证返回0(即布尔表达式为false)?
我应该将b)和c)分成多个SO问题吗?
答案 0 :(得分:2)
a)像这样设置:
A.H:
#ifndef A_HEADER_GUARD
#define A_HEADER_GUARD
class A {...};
#endif
A.cpp:
// A::method1 implementation
// A::method2 implementation
// etc...
B.h:
#ifndef B_HEADER_GUARD
#define B_HEADER_GUARD
#include "A.h"
template <enum VAR> class B {...}
#endif
请注意,B类无法在cpp文件中实现。这是因为B类是一个模板,它的实现必须对实例化模板的人完全可见。
确保您了解header guards(也包括警卫)的使用。
c)是的,shared_ptr::get()
在未初始化时保证为0,如documentation中的后置条件条款中所述。
您可以只检查shared_ptr::get()
本身,而不是检查条件表达式中的shared_ptr
。在布尔上下文中使用时,它会自动将自身转换为bool
。例如:
shared_ptr<A> a_ptr;
if (!a_ptr)
cout << "a_ptr not initialized!";
这是检查智能指针有效性的惯用方法。