【问题标题】:Is there a way to call an initialization function only when specific class template (specialization) is instantiated?有没有办法仅在实例化特定类模板(专业化)时调用初始化函数?
【发布时间】:2015-07-08 13:57:14
【问题描述】:

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

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

【问题讨论】:

  • 标题完全错误,没有描述问题。
  • 为什么不将静态成员委托给单例实例——它将在第一次使用时初始化(并且可以正确处理错误?)

标签: c++ templates c++11 initialization class-template


【解决方案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();
}

遗憾的是,这样您必须在属于Wrapper&lt;NeedInit&gt; 类的每个函数特化中使用static_ctor。但是您不需要检查初始化是否已经被调用。

然后,你可以像你说的那样捕获错误。

【讨论】:

  • 对,这是我想了半天的方法之一。这确实会导致运行时损失,尽管比强制用户调用 init 函数要小得多。 std::cout 是如何处理这个问题的?我认为它在使用时具有某种初始化 stdio 的机制。
  • @rubenvb 嗯,不知道 cout 如何处理 io 初始化。也许只要包含 就会执行,即使不使用 cout?
猜你喜欢
  • 1970-01-01
  • 2010-12-26
  • 1970-01-01
  • 2021-04-23
  • 2013-10-27
  • 2014-01-29
  • 2018-06-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多