【问题标题】:How to make static variable have the same initialization value in shared library and in main program, in a templated class method?如何在模板类方法中使静态变量在共享库和主程序中具有相同的初始化值?
【发布时间】:2018-11-30 00:36:36
【问题描述】:

我创建了一个 TypeManager 类,允许我为 给定的类类型。这是使这成为可能的方法的最简单版本:

template<typename T>
int64_t getTypeId() {
    static int64_t type = typeCounter++;
    return type;
}

这个类被我的主程序和多个共享库使用。问题是该方法为每个相同的类类型创建不同的 Id,当有不同的库时。

如何在没有每个共享库的不同 ID 的情况下完成这项工作?有没有没有静态的解决方案?也许,我可以使用编译标志来完成这项工作?

提前致谢。

【问题讨论】:

  • 问:什么平台?视窗? Linux?其他?问:什么编译器?微博?海合会?其他?
  • 我在 Linux (Ubuntu 18.04.1) 上。我的编译器是 Gcc。但我也需要在 Windows 上进行这项工作。
  • 实际上,如果您有一个仅适用于 Linux 的解决方案,我会接受它;)。

标签: c++ templates static shared-libraries


【解决方案1】:

创建一个共享库。它维护一个从重整类型名称到索引的映射。

打电话给int64_t get_type_integer( std::type_index )。导出它,使其成为线程安全的,等等。

别叫它。

改为调用

template<typename T>
int64_t getTypeId() {
  static int64_t type = details::get_type_integer(typeid(T));
  return type;
}

现在每个 so 都有一个类型,它使用魔法静态来访问/init;每个 .so 每个类型只调用一次获取类型整数。所以那里的代码可以写得安全而不是超快。

直接使用名称而不是type_index,因为在许多系统上两个so中的相同类型可以被认为是不同的类型,但可以具有相同的重整类型名称。

【讨论】:

  • 我已经提供了一个带有重整类型名称向量的解决方案,但它的效率不如我的静态版本。但这可以解决这个问题。谢谢
猜你喜欢
  • 2023-03-29
  • 1970-01-01
  • 2011-01-31
  • 2020-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-28
相关资源
最近更新 更多