テンプレートの実装部をcppに書く

  • 0
    いいね
  • 3
    コメント

    あんまりよろしく無いと思うんですが
    テンプレートの実装部をcppに書く場合

    Unit2.h
    template<typename T>
    struct _X{
        typedef T type;
        T* o_;
        _X();
        ~_X();
        T* func1();
    };
    
    Unit2.cpp
    template<typename T> _X<T>::_X()
    {
        o_ = new T();
    }
    template<typename T> _X<T>::~_X()
    {
        delete o_;
    }
    template<typename T> T* _X<T>::func1()
    {
        decltype(o_) l_ = new T();
        return l_;
    }
    

    こんな感じで分ける事が可能です。
    template<typename T> struct _X{}の場合、cpp実装側でtemplate<typename T> _X<T>::_X(){}するとコンストラクタ実装可能です。

    Unit1.cpp
    #include "Unit2.h"
    #include "Unit2.cpp"
    __fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
    {
        _X<TStringList> x;
        if (std::is_same<_X<TStringList>::type, TStringList>::value)
        {
            std::unique_ptr<_X<TStringList>::type > obj_ = std::make_unique<TStringList>( x.func1() );
            for (int i = 0; i < 10; i++)
            {
                obj_->Append(i);
            }
        }
    }
    //---------------------------------------------------------------------------
    
    

    コンパイル時に毎度cppも呼ば無いとリンクエラーになるので
    実装もヘッダーに書く方が良いと思います。

    https://community.embarcadero.com/blogs/entry/cpp-japan