Как определить шаблон глобальной переменной в C ++? - PullRequest
0 голосов
/ 05 февраля 2011

Предположим, вам нужно написать библиотеку шаблонов, которая работает с типом, предоставленным клиентом.Также предположим, что этой библиотеке действительно необходим доступ к глобальной переменной, параметризованной типом, предоставленным клиентом.Как бы вы реализовали этот шаблон?

Ответы [ 2 ]

0 голосов
/ 05 февраля 2011

@ AnonymousCoward

это получено из вашего решения.обратите внимание на шаблоны инициализации / уничтожения в этом варианте (прочитайте вывод, если он еще не запомнен).Вы можете использовать это, чтобы отложить создание до доступа, а также уничтожить и освободить при завершении (что может быть полезно для пользовательских типов):

#include <iostream>
#include <memory>

class t_custom {
public:
    t_custom() {
        std::cout << "custom ctor: " << __PRETTY_FUNCTION__ << "\n";
    }

    ~t_custom() {
        std::cout << "custom dtor: " << __PRETTY_FUNCTION__ << "\n";
    }
};

template<typename T>
class Global {
public:
    static T* Shared() {
        std::cout << "enter: " << __PRETTY_FUNCTION__ << "\n";
        static std::auto_ptr<T>pVar(new T);
        std::cout << "access: " << __PRETTY_FUNCTION__ << ":\t\t";
        return pVar.get();
    }

private:
    Global();
    ~Global();
    Global(const Global& rhs);
    Global& operator=(const Global& rhs);
};

template<typename T>
class Global_orig {
public:
    static T* const pVar;
private:
    Global_orig();
    Global_orig(const Global_orig& rhs);
    Global_orig& operator=(const Global_orig& rhs);
};

template<typename T>T* const Global_orig<T>::pVar(new T); // << oh no! global construction

int main(int argc, char* const argv[]) {

    std::cout << ">> main: " << __PRETTY_FUNCTION__ << "\n\n";

    std::cout << Global<float>::Shared() << "\n";
    std::cout << Global<int>::Shared() << "\n";
    std::cout << Global<t_custom>::Shared() << "\n";

    std::cout << Global_orig<t_custom>::pVar << "\n";

    std::cout << "\n<< main: " << __PRETTY_FUNCTION__ << "\n\n";

    return 0;
}

также может быть хорошей идеей для клиента предоставить фабрикуфунктор для вас, вместо того, чтобы заставлять их использовать инициализатор T по умолчанию.

0 голосов
/ 05 февраля 2011

Вот решение, которое я использую для эмуляции этого поведения:

template <typename T> class Global {
public:    
    static T *pVar;

private:    
    Global() {}
    Global(const Global& rhs) {}
    void operator=(const Global& rhs) {}
};

template <typename T> T* Global<T>::pVar = new T;

Похоже, что я делаю то, что хочу для моего конкретного приложения.Есть ли проблема, которая ограничивает его применимость?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...