【发布时间】:2020-01-09 16:59:16
【问题描述】:
我创建了一个模板类,它在发生实例化时触发运行时文本输出:
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!
另一方面,当我将它与 CRTP 模式一起使用时,似乎不会发生实例化:
class test : public base<test>
{
};
这种行为符合 ISO 标准吗?我可以以某种方式强制进行实例化,而不需要我的模板类 (base) 的用户编写额外的代码吗?对我来说,重要的是静态变量构造函数的副作用。
【问题讨论】:
-
当您说“实例化”时,您是指模板实例化还是创建对象的实例?因为您编写的代码是后者,而不是前者。在模板实例化期间无法获取消息,因为这是一个编译时过程,而不是运行时过程。
-
你不能用静态断言得到消息
-
@NicolBolas 目的是在程序初始化期间获取消息,这在显式实例化
base<int>时有效,但在执行 CRTP 时无效。见wandbox.org/permlink/yp5bGnsCTDcHMtrY。 -
@Yamahari 不在有效程序中。如果您看到来自
static_assert的消息,则说明您的程序格式错误。 -
Odr 使用
v(例如在析构函数或构造函数中)。