Шаблоны C ++ - Как использовать несколько MTU - PullRequest
2 голосов
/ 12 марта 2011
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?

1 Ответ

2 голосов
/ 12 марта 2011

а) Настройте его так:

хиджра:

#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 является шаблоном, и его реализация должна быть полностью видимой для любого, кто создает экземпляр шаблона.

Убедитесь, что вы понимаете использование охранников заголовка (также включает охранников).


б) Написание приватных вспомогательных методов для «вычеркивания» часто повторяющегося кода вполне нормально, и я бы даже сказал, что это поощряется.


в) Да, shared_ptr::get() гарантированно будет 0 при неинициализированном, как указано в пунктах постусловий в документации .

Вместо проверки shared_ptr::get() в выражении условия вы можете просто проверить сам shared_ptr. Он автоматически преобразуется в bool при использовании в логическом контексте. Например:

shared_ptr<A> a_ptr;
if (!a_ptr)
    cout << "a_ptr not initialized!";

Это идиоматический способ проверки правильности умного указателя.

...