我试图创建只在模板被实例化时执行某些代码的程序(它将用于低级驱动程序初始化)。 现在我有以下解决方案。
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();
行?
答案 0 :(得分:2)
您的问题是,除非引用模板,否则不会实例化模板的成员。
您可以只引用该成员:
,而不是调用init.silly()
static void myMethod1(){
(void)init;
// ... Something useful
}
或者,如果您希望绝对定义init
,则可以显式实例化它:
template<>
const Initializer Proxy<void>::init{};
答案 1 :(得分:2)
模板和低级驱动程序初始化?..我试着尽可能地使它成为C,以确保准确的行为。
你可以这样做:
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
非静态,而Proxy()构造函数会创建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
中的代码。