4

我正在为各种计算功能设计一个包装器。一些底层后端需要在调用任何其他 API 之前调用一些 init 函数。我可以使用一些在 main 之前初始化的静态变量,并将其包装在一些函数中,如此处所述以便我可以捕获初始化期间产生的任何错误。

我想知道是否有更好的方法来处理这个问题。请注意,永远不会有类模板的实例,因为一切都是 typedef 或静态成员。

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 回答