c++ - 创建 C++ 模板函数的 C 符号别名

标签 c++ templates c++11 ld

我需要生成许多具有以下形式的 C 链接的包装器:

  int myfunc (type0 param0, type1 param1, ..., typeN paramN) {
       return (*g_libc.myfunc ## _fn) (param0, etc...)
  }

到目前为止,我使用了很多宏:

  #define NATIVE(name,...) \
  auto name (FULL_ARGS(__VA_ARGS__)) \
  {                                                             \
    return (*mystruct.name ## _fn) (ARGS (__VA_ARGS__));              \
  }

但出于各种原因我想在 C++11 中使用可变参数模板。我有一个可用的可变参数函数,可以取代以前的hackish实现:

#define NATIVE(name) template <typename... Args> \
auto name (Args&&... args) -> decltype( name ( std::forward<Args>(args)...) ) \
{ \
  return g_libc. name ## _fn (std::forward<Args>(args)...); \
}

但是这样我就会失去 C 链接(因为模板不能有 C 链接)。因此,我的想法是使用指向模板化函数的所需函数名称创建一个别名。 似乎可以使用 C 符号作为 C++ 函数的别名(可能看起来很明显,但我必须测试它并且它工作正常)。然而,为了能够为模板化函数添加别名,我需要在编译时知道它的损坏名称,这似乎很难正确(没有 gcc 扩展来做到这一点,尽管我也想支持 clang)。我的结论是,我应该添加别名作为后处理步骤。

所以问题是如何向已构建的共享库添加符号别名? (我可以“grep”“nm”输出来检索损坏的符号)

致以诚挚的问候

最佳答案

宏应该创建另一种带有 C 链接的重整函数名称,用于调用 C++ 函数。使其内联可以消除性能问题。

关于c++ - 创建 C++ 模板函数的 C 符号别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38484895/

相关文章:

javascript - Tornado 和 JavaScript 库的问题

c++ - 与 C++ 中的普通指针相比,智能指针的开销是多少?

java - Python Web 框架与 Java Web 框架(Python 中的 Web 开发是如何完成的?)

c++ - 模板类找不到构造函数

c++ - C++11 中引入了哪些重大变化?

c++ - 模板类的部分模板特化,如 std::function

c++ - Python SIP 暴露函数

c++ - make_pair 如何知道其参数的类型?

c++ - 单行类声明和实例化

c++ - 如果类 "A"有一个指向另一个类 "B"的指针,A 可以访问类 B 的公共(public)方法