我正在为各种计算功能设计一个包装器。一些底层后端需要在调用任何其他 API 之前调用一些 init 函数。我可以使用一些在 main 之前初始化的静态变量,并将其包装在一些函数中,如此处所述,以便我可以捕获初始化期间产生的任何错误。
我想知道是否有更好的方法来处理这个问题。请注意,永远不会有类模板的实例,因为一切都是 typedef 或静态成员。
我正在为各种计算功能设计一个包装器。一些底层后端需要在调用任何其他 API 之前调用一些 init 函数。我可以使用一些在 main 之前初始化的静态变量,并将其包装在一些函数中,如此处所述,以便我可以捕获初始化期间产生的任何错误。
我想知道是否有更好的方法来处理这个问题。请注意,永远不会有类模板的实例,因为一切都是 typedef 或静态成员。
为了解决仅针对某些专业化初始化 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>
类的每个函数特化中使用。但是您不需要检查初始化是否已经被调用。
然后,您可以像您说的那样捕获错误。