C ++模板 - 如何跨多个MTU使用

时间:2011-03-12 00:51:09

标签: c++ design-patterns templates boost shared-ptr

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';这样,它将保持单独的静态和“跟踪”他们自己的xy(A_ptrs)。

问题:

a)如何在模板正常工作的情况下将其设置为标头/源配置?

b)我应该形成'createA'功能而不是x.reset(new A(0, VAR));

c)当未初始化时,shared_ptr.get()是否保证返回0(即布尔表达式为false)?

我应该将b)和c)分成多个SO问题吗?

1 个答案:

答案 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(也包括警卫)的使用。


b)编写私有帮助方法来“分解”频繁重复的代码是很正常的,我甚至会说鼓励。


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!";

这是检查智能指针有效性的惯用方法。