静态类模板成员初始化

时间:2015-05-30 18:10:01

标签: templates c++11 visual-c++ static msvc12

尝试初始化静态类模板的静态成员时遇到问题。

基本上,我认为这种方法对以下方面有用: 我有很多对象,当然它们都是相同的Base类型,但它们有不同的对象类型。我只是想操纵这些对象,这就是我决定使用静态模板的原因,因为这些对象可以包含很多不同的类型。

但是,对于日志记录和选项传递,我想将相应的成员添加到模板中,而不必为每个派生的静态类编写初始化器。

请注意,以下代码实际正在运行,因为涉及一些SDK。 我只是想要正确的方法,而不是正确的代码。

提前致谢。 :)

template.h:

#ifndef _TEMPLATE_H
#define _TEMPLATE_H

#include "stats.h"

template<class T>
class TemplateObj
{
public:
    static void SetParameters(const Options& options)
    {
        T::_options = options;  // Is this even possible?
        T::Init();
        T::DoStuff(_options);
    }

protected:
    static void Message() { stats.Print("Message from Template static method"); }
    static Stats& TemplateObj<T>::stats = Stats::GetInstance(); // This will not work as this is a non-trivial initializer, how to do it correctly? Stats::GetInstance() retrieves a singleton instance
    static Options& TemplateObj<T>::_options;   // Possible?
};

#endif

derived.h:

#ifndef _DERIVED_H
#define _DERIVED_H
#include "template.h"

class Derived :TemplateObj < Derived >
{
public:
    static void Init();
    static void DoStuff(Options& options)
};

#endif

derived.cpp:

#include "derived.h"

void Derived::Init()
{
    // Init stuff here
    TemplateObj::Message(); // Call static method from template directly
}

void Derived::DoStuff(Options& options)
{
    // Do something with options 
    stats.Print("Message from derived static method."); // Access to "stats" here. "stats" should be declared and initialized inside the template.
    options.Load(); // Example
}

main.h

#include "derived.h"

main()
{
    TemplateObj<Derived>::SetParameters(new Options);
}

1 个答案:

答案 0 :(得分:0)

基本上,如果函数定义位于类定义中,则不需要将TemplateObj<T>::放在函数定义之前。以下两个都是有效的:

template<class T>
class A{
    void func( void );
};

template<class T>
void A<T>::func() { /* Okay */ }

template<class T>
class B {
    void func( void ){ /* Okay */ }
};

在您的情况下,请将以下static Stats& TemplateObj<T>::stats = Stats::GetInstance();替换为static Stats& stat() { return Stats::GetInstance(); }

以下static Options& TemplateObj<T>::_options;以及此static Options& _options;

另一方面,将此T::_options = options;替换为TemplateObj<T>::_options = options;