2011-02-05 14 views
0

クライアント提供型で動作するテンプレートライブラリを作成する必要があるとします。また、このライブラリが実際にクライアント提供型でパラメータ化されたグローバル変数にアクセスする必要があるとします。どのようにこのパターンを実装するつもりですか?ここでC++でグローバル変数テンプレートを定義する方法は?

答えて

0

@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

は、私はこの動作をエミュレートするために使用するソリューションです:

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; 

私が私の特定のアプリケーションのためにやりたいようです。適用範囲を制限する問題はありますか?

関連する問題