4

さまざまな計算機能のラッパーを設計しています。基礎となるバックエンドの一部では、他の API 呼び出しが行われる前に、いくつかの init 関数を呼び出す必要があります。メインの前に初期化される静的変数を使用し、ここで説明されているように関数にラップして、初期化中に生成されたエラーをキャッチできるようにすることができます。

これを処理するためのより良い方法があるかどうか疑問に思います。すべてが typedef または static メンバーであるため、クラス テンプレートのインスタンスは存在しないことに注意してください。

4

1 に答える 1

1

一部の特殊化のためにのみAPI を初期化し、一度だけ初期化するという問題に対処するには、次のようにします。

#include <iostream>

template <typename T>
struct Wrapper
{
    // class who will be statically instantiated
    struct CtorClass
    {
        CtorClass()
        {
            std::cout << "Init\n";
        }
    };

    static CtorClass static_ctor;

    static void compute1(){}
    static void compute2(){}

};

// definition for template static member cons
template <typename T>
typename Wrapper<T>::CtorClass Wrapper<T>::static_ctor;

struct NeedInit{};

// you will have to use static_ctor in every funcition of the
template <>
void Wrapper<NeedInit>::compute1()
{
    static_ctor;
}

template <>
void Wrapper<NeedInit>::compute2()
{
    static_ctor;
}

int main()
{
    Wrapper<int>::compute1();
    Wrapper<int>::compute2();
    Wrapper<NeedInit>::compute1();
    Wrapper<NeedInit>::compute2();
}

悲しいことに、この方法では、クラスstatic_ctorに属するすべての関数の特殊化で使用する必要があります。Wrapper<NeedInit>ただし、初期化が既に呼び出されているかどうかを確認する必要はありません。

次に、あなたが言ったようにエラーをキャッチできます。

于 2015-04-29T11:38:43.987 に答える