gpt4 book ai didi

c++ - CRTP 模式不会触发完整模板实例化

转载 作者:行者123 更新时间:2023-12-02 02:29:08 28 4
gpt4 key购买 nike

我创建了一个模板类,只要发生实例化,它就会触发运行时文本输出:

template<typename T>
struct verbose {
verbose()
{
std::cout << "Instantation occured!" << std::endl;
}
};

template<typename T>
struct base
{
inline static verbose<T> v;
};

当我强制创建实例化时,它会显示输出:

template struct base<int>;
//output: Instantation occured!

(Check on Wandbox)。

另一方面,当我将它与 CRTP 模式一起使用时,似乎没有发生实例化:

class test : public base<test>
{
};

( Check on Wandbox )

这种行为符合 ISO 标准吗?我可以以某种方式强制进行实例化,而不需要我的模板类(base)的用户编写额外的代码吗?对我来说,重要的是静态变量构造函数的副作用。

最佳答案

您的 CRTP 使用属于隐式实例化:

When code refers to a template in context that requires a completely defined type, or when the completeness of the type affects the code, and this particular type has not been explicitly instantiated, implicit instantiation occurs. For example, when an object of this type is constructed, but not when a pointer to this type is constructed.

This applies to the members of the class template: unless the member is used in the program, it is not instantiated, and does not require a definition.
cppreference

在第二段之后,从base<test>::v开始从未实际使用过,没有 base<test>::v 的实例化确实发生了。

由于需要使用来生成其实例化,因此需要额外的代码来获得所需的输出。例如,您可以将构造函数添加到 base :

template<typename T>
struct base
{
inline static verbose<T> v;
base() { (void)&v; }
};

仅此还不足以根据 test 的定义触发您的输出通过它自己。但是,如果您的程序尝试从 test 创建对象,那么构造函数的形成将导致模板的构造函数被使用,从而 base<test>::v将被实例化。

关于c++ - CRTP 模式不会触发完整模板实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59668843/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com