跨模板化函数编译的静态变量

Static variable across templated function compilations

本文关键字:静态 变量 编译 函数      更新时间:2023-10-16

创建模板化函数时,每个模板都是其自己的独立版本。因此,静态变量仅相对于调用它的函数是静态的。

有哪些有效的方法可以解决这个问题,同时仍然保持数据对函数的私有,特别是对于标头/内联函数中的函数?

我在想一些类似的事情,但它当时是文件的私有的:

namespace
{
unsigned char none;
}
template< typename t > unsigned char foo( )
{
return none;
}

您可以使用以下策略:

  1. 在函数模板的实现中调用常规函数。
  2. 将数据作为静态变量存储在常规函数中。

大致如下:

unsigned char foo_impl()
{
static unsigned char none = <some initializer>;
return none;
}
template< typename t > unsigned char foo( )
{
return foo_impl();
}

您可以在源文件而不是头文件中实现foo_impl,以防需要封装其实现。

在 C++17 中,我建议使用inline变量,这样您就可以将其保留在标题中并避免重复符号:

inline class cfoo_internal {
unsigned char none /* = initialize */;
template< typename t > friend unsigned char foo();
} foo_internal;
template< typename t > unsigned char foo( )
{
return foo_internal.none;
}