有没有办法只在实例化特定 class 模板(专业化)时调用初始化函数?
Is there a way to call an initialization function only when specific class template (specialization) is instantiated?
我正在为各种计算功能设计包装器。一些底层后端需要在进行任何其他 API 调用之前调用一些 init 函数。我可以使用一些在 main 之前初始化的静态变量,并将其包装在某个函数中,如所述 here 这样我就可以捕获初始化过程中产生的任何错误。
我想知道是否有更好的方法来处理这个问题。请注意,永远不会有 class 模板的实例,因为一切都是 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();
}
遗憾的是,这样您必须在属于 Wrapper<NeedInit>
class 的每个函数特化中使用 static_ctor
。但是您不需要检查是否已经调用了初始化。
然后,你就可以像你说的那样捕获错误了。
我正在为各种计算功能设计包装器。一些底层后端需要在进行任何其他 API 调用之前调用一些 init 函数。我可以使用一些在 main 之前初始化的静态变量,并将其包装在某个函数中,如所述 here 这样我就可以捕获初始化过程中产生的任何错误。
我想知道是否有更好的方法来处理这个问题。请注意,永远不会有 class 模板的实例,因为一切都是 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();
}
遗憾的是,这样您必须在属于 Wrapper<NeedInit>
class 的每个函数特化中使用 static_ctor
。但是您不需要检查是否已经调用了初始化。
然后,你就可以像你说的那样捕获错误了。