加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 有没有办法在实例化特定的类模板(特化)时调用初始化函数?

发布时间:2020-12-16 07:11:56 所属栏目:百科 来源:网络整理
导读:我正在设计一个包含各种计算功能的包装器.一些底层后端需要在进行任何其他API调用之前调用一些init函数.我可以使用一些在main之前初始化的静态变量,并将其包装在 here所描述的某个函数中,以便我可以捕获初始化期间产生的任何错误. 我想知道是否有更好的方法
我正在设计一个包含各种计算功能的包装器.一些底层后端需要在进行任何其他API调用之前调用一些init函数.我可以使用一些在main之前初始化的静态变量,并将其包装在 here所描述的某个函数中,以便我可以捕获初始化期间产生的任何错误.

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

解决方法

为了解决仅针对某些特化而初始化API的问题,以及仅初始化一次的问题,我会做类似这样的事情:

#include <iostream>

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

    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>的每个函数专门化中使用static_ctor.类.但是您不需要检查已经调用的初始化.

然后,你可以像你说的那样捕捉错误.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读