力模板静态成员实例
Force template static member instantiation
我正在尝试创建仅在实例化模板时执行某些代码的程序(它将用于低级驱动器初始化(。现在我有以下解决方案。
class Initializer
{
public:
Initializer(){
// This code is executed once
}
void silly() const{
}
};
template <class T>
class Proxy{
protected:
static const Initializer init;
};
template<class T>
const Initializer Proxy<T>::init;
template<class T>
class MyTemplate : public Proxy<void>{
public:
static void myMethod1(){
init.silly();
// ... Something useful
}
static void myMethod2(){
init.silly();
// ... Something useful
}
};
Initializer
默认构造函数仅在我调用myMethod1()
或myMethod2()
的某个地方执行。
但是有没有办法摆脱这些init.silly();
行?
您的问题是,除非引用模板的成员,否则不会实例化。
而不是调用init.silly()
,您只能引用成员:
static void myMethod1(){
(void)init;
// ... Something useful
}
或,如果您希望init
绝对定义,则可以明确实例化:
template<>
const Initializer Proxy<void>::init{};
模板和低级驱动器初始化?
您可以做类似的事情:
class Initializer
{
public:
Initializer() {
// This code is executed once
}
};
template <class T>
class Proxy {
protected:
Proxy()
{
static Initializer init;
}
};
template<class T>
class MyTemplate : public Proxy<void> {
public:
void myMethod1() {
// ... Something useful
}
void myMethod2() {
// ... Something useful
}
};
您的所有代码仅使用静态功能,并没有真正显示为什么使用类和模板。通过我的更改,我制作了myMethod1
和myMethod2
非静态和代理((构造函数将创建Initializer
一次。
请注意,由于所有模板,您的Initializer
可能会像实例化代理模板一样多次执行。你真的是说吗?如果没有,请将其转换为没有意外结果的清晰可读代码。对于其他人来说,这也将更好地维护和可读性:
class Initializer
{
Initializer() {
// This code is executed once
}
public:
void init()
{
static Initializer init;
}
};
template<class T>
class MyTemplate {
public:
static void myMethod1() {
Initializer::init();
// ... Something useful
}
static void myMethod2() {
Initializer::init();
// ... Something useful
}
};
这绝对可以清楚地表明,Initializer
仅在调用myMethod1
或myMethod2
之前创建一次。如果没有任何调用您的Initializer::init
,则应在链接时间删除Initializer
的代码。
相关文章:
- 实例成员与静态成员与非类方法的开销
- 为什么可以在没有实例变量的情况下访问静态回调方法中的静态成员变量?
- 为什么可以在编译时访问非常量、非静态成员而无需类的实例
- 力模板静态成员实例
- C :在没有对象实例的情况下调用非静态成员函数
- 类成员的C++静态成员变量实例化了两次
- 由类中未实例化的静态成员变量引起的未定义引用C++
- 访问不带实例化对象的非静态成员函数
- 类的实例是否仍在同一进程内的线程之间共享相同的静态成员
- 具有静态成员实例的单一实例
- C++静态成员的多个实例
- 静态成员与静态常量成员实例化 - 有什么区别?
- 模板类的静态成员,除非显式专用化,否则不会实例化
- 强制 clang 为类模板实例化的从不引用的静态成员函数发出代码
- C++ 在声明静态成员时是否创建实例
- 强制实例化模板类中的静态成员
- 使用静态成员实例的 C++ 中的线程安全单一实例(无延迟实例化)
- 使用单一实例分配静态成员
- 通过对象实例访问私有静态成员
- 在类模板的成员函数的实例化中,非静态成员函数的使用无效