C++ 使用静态初始化注册类

C++ 使用静态初始化注册类,c++,c++11,C++,C++11,所以我读了这篇关于使用静态初始化注册类()的文章。这正是我需要的,所以我决定实施它。然而,我无法让它工作,所以我做了一个小测试用例,以确保我得到了正确的细节。事实证明,即使是一个简单的示例也不起作用(): #包括 int a=0; 模板< T类 > 类可编写脚本{ 受保护的: 结构代理 { 代理服务器(){ std::cout它不起作用,因为没有理由构建你的代理。在这种情况下,你的main()甚至没有构建对象-那么为什么要构建代理呢?你至少必须这样做: int main() { Obje

所以我读了这篇关于使用静态初始化注册类()的文章。这正是我需要的,所以我决定实施它。然而,我无法让它工作,所以我做了一个小测试用例,以确保我得到了正确的细节。事实证明,即使是一个简单的示例也不起作用():

#包括
int a=0;
模板<
T类
>
类可编写脚本{
受保护的:
结构代理
{
代理服务器(){

std::cout它不起作用,因为没有理由构建你的
代理。在这种情况下,你的
main()
甚至没有构建
对象
-那么为什么要构建
代理
呢?你至少必须这样做:

int main() {
    Object o;
    std::cout << "Done " << a << std::endl;
}
如果我添加这两位(
objecto;
Scriptable
构造函数),那么您的代码将生成:

Proxy was executed! ID: [Object]
Done 1
另一种方法是在构造函数中实际声明
代理

Scriptable() {
    proxy_; // this line throws a warning, since this line does nothing,
            // so replace it with something reasonable. but this line is
            // enough to force proxy_ to be instantiated.
}
Scriptable() {
    static Proxy proxy_;
}

它不起作用,因为没有理由构造你的
代理。在这种情况下,你的
main()
甚至没有构造
对象
-那么为什么要构造
代理
?你至少要这样做:

int main() {
    Object o;
    std::cout << "Done " << a << std::endl;
}
如果我添加这两位(
objecto;
Scriptable
构造函数),那么您的代码将生成:

Proxy was executed! ID: [Object]
Done 1
另一种方法是在构造函数中实际声明
代理

Scriptable() {
    proxy_; // this line throws a warning, since this line does nothing,
            // so replace it with something reasonable. but this line is
            // enough to force proxy_ to be instantiated.
}
Scriptable() {
    static Proxy proxy_;
}

它不起作用,因为没有理由构造你的
代理。在这种情况下,你的
main()
甚至没有构造
对象
-那么为什么要构造
代理
?你至少要这样做:

int main() {
    Object o;
    std::cout << "Done " << a << std::endl;
}
如果我添加这两位(
objecto;
Scriptable
构造函数),那么您的代码将生成:

Proxy was executed! ID: [Object]
Done 1
另一种方法是在构造函数中实际声明
代理

Scriptable() {
    proxy_; // this line throws a warning, since this line does nothing,
            // so replace it with something reasonable. but this line is
            // enough to force proxy_ to be instantiated.
}
Scriptable() {
    static Proxy proxy_;
}

它不起作用,因为没有理由构造你的
代理。在这种情况下,你的
main()
甚至没有构造
对象
-那么为什么要构造
代理
?你至少要这样做:

int main() {
    Object o;
    std::cout << "Done " << a << std::endl;
}
如果我添加这两位(
objecto;
Scriptable
构造函数),那么您的代码将生成:

Proxy was executed! ID: [Object]
Done 1
另一种方法是在构造函数中实际声明
代理

Scriptable() {
    proxy_; // this line throws a warning, since this line does nothing,
            // so replace it with something reasonable. but this line is
            // enough to force proxy_ to be instantiated.
}
Scriptable() {
    static Proxy proxy_;
}

有了Pradhan的链接,我可以编写出我需要的东西:

#include <iostream>

int a = 0;

template <typename T, T /*unnamed*/>
struct nnb_ForceInit { };

template<
    class T
>
class Scriptable {
public:
    struct nnb_Proxy {
        nnb_Proxy() {
            std::cout << "Proxy was executed! ID: " << T::id << std::endl;
            a++;
        }
    };

    static nnb_Proxy __nnb_proxy__;
    typedef nnb_ForceInit<nnb_Proxy&, __nnb_proxy__> __nnb_typedef_dummy__;
} ;

template<
    class T
>
typename Scriptable<T>::nnb_Proxy Scriptable<T>::__nnb_proxy__;

class Object : public Scriptable<Object> {
public:
    constexpr static auto id = "[Object]";
};

class Image : public Scriptable<Image> {
public:
    constexpr static auto id = "[Image]";
};

class Error : public Scriptable<Error> {
public:
    constexpr static auto id = "[Error]";
} ;

int main() {
    std::cout << "Done " << a << std::endl;
}
#包括
int a=0;
模板
结构nnb_ForceInit{};
模板<
T类
>
类可编写脚本{
公众:
结构nnb_代理{
nnb_Proxy(){

std::cout有了Pradhan的链接,我可以制作出我需要的东西:

#include <iostream>

int a = 0;

template <typename T, T /*unnamed*/>
struct nnb_ForceInit { };

template<
    class T
>
class Scriptable {
public:
    struct nnb_Proxy {
        nnb_Proxy() {
            std::cout << "Proxy was executed! ID: " << T::id << std::endl;
            a++;
        }
    };

    static nnb_Proxy __nnb_proxy__;
    typedef nnb_ForceInit<nnb_Proxy&, __nnb_proxy__> __nnb_typedef_dummy__;
} ;

template<
    class T
>
typename Scriptable<T>::nnb_Proxy Scriptable<T>::__nnb_proxy__;

class Object : public Scriptable<Object> {
public:
    constexpr static auto id = "[Object]";
};

class Image : public Scriptable<Image> {
public:
    constexpr static auto id = "[Image]";
};

class Error : public Scriptable<Error> {
public:
    constexpr static auto id = "[Error]";
} ;

int main() {
    std::cout << "Done " << a << std::endl;
}
#包括
int a=0;
模板
结构nnb_ForceInit{};
模板<
T类
>
类可编写脚本{
公众:
结构nnb_代理{
nnb_Proxy(){

std::cout有了Pradhan的链接,我可以制作出我需要的东西:

#include <iostream>

int a = 0;

template <typename T, T /*unnamed*/>
struct nnb_ForceInit { };

template<
    class T
>
class Scriptable {
public:
    struct nnb_Proxy {
        nnb_Proxy() {
            std::cout << "Proxy was executed! ID: " << T::id << std::endl;
            a++;
        }
    };

    static nnb_Proxy __nnb_proxy__;
    typedef nnb_ForceInit<nnb_Proxy&, __nnb_proxy__> __nnb_typedef_dummy__;
} ;

template<
    class T
>
typename Scriptable<T>::nnb_Proxy Scriptable<T>::__nnb_proxy__;

class Object : public Scriptable<Object> {
public:
    constexpr static auto id = "[Object]";
};

class Image : public Scriptable<Image> {
public:
    constexpr static auto id = "[Image]";
};

class Error : public Scriptable<Error> {
public:
    constexpr static auto id = "[Error]";
} ;

int main() {
    std::cout << "Done " << a << std::endl;
}
#包括
int a=0;
模板
结构nnb_ForceInit{};
模板<
T类
>
类可编写脚本{
公众:
结构nnb_代理{
nnb_Proxy(){

std::cout有了Pradhan的链接,我可以制作出我需要的东西:

#include <iostream>

int a = 0;

template <typename T, T /*unnamed*/>
struct nnb_ForceInit { };

template<
    class T
>
class Scriptable {
public:
    struct nnb_Proxy {
        nnb_Proxy() {
            std::cout << "Proxy was executed! ID: " << T::id << std::endl;
            a++;
        }
    };

    static nnb_Proxy __nnb_proxy__;
    typedef nnb_ForceInit<nnb_Proxy&, __nnb_proxy__> __nnb_typedef_dummy__;
} ;

template<
    class T
>
typename Scriptable<T>::nnb_Proxy Scriptable<T>::__nnb_proxy__;

class Object : public Scriptable<Object> {
public:
    constexpr static auto id = "[Object]";
};

class Image : public Scriptable<Image> {
public:
    constexpr static auto id = "[Image]";
};

class Error : public Scriptable<Error> {
public:
    constexpr static auto id = "[Error]";
} ;

int main() {
    std::cout << "Done " << a << std::endl;
}
#包括
int a=0;
模板
结构nnb_ForceInit{};
模板<
T类
>
类可编写脚本{
公众:
结构nnb_代理{
nnb_Proxy(){

std::这难道不是个坏消息吗?如果这是唯一的解决方案,那就意味着我链接的文章真的错了。它没有列出这些步骤中的任何一个。幸运的是,在重复的问题中,Pradhan建议可以找到一个技巧来强制初始化代理。我会在答案中添加解决方案。谢谢你的回答!这是个坏消息-如果这将是唯一的解决方案,这意味着我链接的文章确实是错误的。它没有列出这些步骤中的任何一个。幸运的是,在重复的问题中,Pradhan建议可以找到一个强制初始化代理的技巧。我将在答案中添加解决方案。谢谢你的回答!这是个坏消息-如果这是唯一的解决方案的话这意味着我链接到的文章确实是错误的。它没有列出这些步骤中的任何一个。幸运的是,在重复的问题中,Pradhan建议可以找到一个强制初始化代理的技巧。我将在答案中添加解决方案。感谢你的回答!这是个坏消息-如果这是唯一的解决方案,那么这意味着文章链接到确实是错误的。它没有列出这些步骤中的任何一个。幸运的是,在重复的问题中,Pradhan建议可以找到一个技巧来强制初始化代理。我将在答案中添加解决方案。谢谢你的回答!这是拼图中缺失的部分。谢谢!这是拼图中缺失的部分。谢谢!这是mising拼图的一部分。谢谢!这是拼图中缺失的一部分。谢谢!这确实有效,但诀窍是添加nnb_ForceInit,否则编译器不会初始化静态变量nnb_proxy为什么不初始化它?这确实有效,但诀窍是添加nnb_ForceInit,否则编译器不会初始化静态变量ble nnb_proxy为什么不初始化它?这确实有效,但诀窍是添加nnb_ForceInit,否则编译器不会初始化静态变量nnb_proxy为什么不会初始化它?这确实有效,但诀窍是添加nnb_ForceInit,否则编译器不会初始化静态变量nnb_proxy为什么不会是initia莉莎?