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

时间:2018-10-11 05:07:51

标签: c++

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

有什么有效的方法可以解决此问题,同时仍将数据保留给该函数私有,特别是对于标头/内联函数中的函数而言?

我正在按照这些思路考虑,但是那时它对文件是私有的:

namespace
{
    unsigned char none;
}

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

2 个答案:

答案 0 :(得分:3)

您可以使用以下策略:

  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

答案 1 :(得分:0)

在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;
}