static Class 模板成员初始化
Static Class Template member initialization
我在尝试初始化静态 class 模板的静态成员时遇到问题。
基本上,我认为这种方法的用途是:
我有很多对象,它们当然都是相同的基本类型,但它们具有不同的对象类型。我只想操纵这些对象,这就是我决定使用静态模板的原因,因为这些对象可以包含很多不同的类型。
但是,对于日志记录和选项传递,我想将相应的成员添加到模板中,而不必为每个派生静态 class.
编写初始化程序
请注意,以下代码不是实际工作的,因为涉及到一些 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);
}
基本上,如果函数定义在 class 定义内,则不需要在函数定义前放置 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;
。
我在尝试初始化静态 class 模板的静态成员时遇到问题。
基本上,我认为这种方法的用途是: 我有很多对象,它们当然都是相同的基本类型,但它们具有不同的对象类型。我只想操纵这些对象,这就是我决定使用静态模板的原因,因为这些对象可以包含很多不同的类型。
但是,对于日志记录和选项传递,我想将相应的成员添加到模板中,而不必为每个派生静态 class.
编写初始化程序请注意,以下代码不是实际工作的,因为涉及到一些 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);
}
基本上,如果函数定义在 class 定义内,则不需要在函数定义前放置 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;
。