C++ 暴露C++;共享库中的模板方法

C++ 暴露C++;共享库中的模板方法,c++,templates,C++,Templates,我试图创建一个共享库来公开一些C++方法。 我只是创建一个包装器,在其中使用外部“C”链接将方法公开为C函数 在相应的C函数中,我创建了类的一个对象,并调用了相应的方法 我遇到的问题是一些需要公开的方法使用模板作为参数 例如: C++:< /P> 我应该如何公开另一种方法 我可以在C包装函数中使用typeid运算符来确定参数的类型吗 还有其他更好的主意吗 由于C不支持模板或typeid,您有点被卡住了 我能想到的最好/最简单的方法是为您希望使用的每个参数类型创建一个C函数版本 void writ

我试图创建一个共享库来公开一些C++方法。 我只是创建一个包装器,在其中使用外部“C”链接将方法公开为C函数

在相应的C函数中,我创建了类的一个对象,并调用了相应的方法

我遇到的问题是一些需要公开的方法使用模板作为参数

例如: C++:< /P> 我应该如何公开另一种方法

  • 我可以在C包装函数中使用typeid运算符来确定参数的类型吗
  • 还有其他更好的主意吗

  • 由于C不支持模板或typeid,您有点被卡住了

    我能想到的最好/最简单的方法是为您希望使用的每个参数类型创建一个C函数版本

    void write_int( int i )
    {
      myclass obj;
      obj.write(i);
    }
    
    void write_string( char * s )
    {
      myclass obj;
      obj.write(s);
    }
    
    另一个选项可能是打开类型并传递void*指针

    void write( int type, void* ptr )
    {
       myclass obj;
       switch(type)
       {
          case C_INT:
            obj.write( *static_cast<int*>(ptr) );
            break;
          case C_STR:
            obj.write( *static_cast<char**>(ptr) );
            break;
          default:
            //Some kind of error.
       }
    }
    
    您可以通过定义隐藏函数的宏来检测此函数中的某些使用错误:

    #define write(X,Y) write(X,Y)
    

    这意味着使用错误数量的参数会产生错误。

    模板不是C的一部分-请只使用相关的标记。我已经通过传递一个空指针使用了选项2。但是希望避免多次调用函数的开销。
    obj.write
    函数在每次调用包装器
    write
    函数时只调用一次。然而,在写< /COD>函数的正文中,有多个拷贝<>代码> Obj/<代码>,由于C++模板和C函数之间的不匹配,无法避免这种情况。(您可能可以使用宏来减少复制,但就我个人而言,我不会走这条路。)
    void write( int type, void* ptr )
    {
       myclass obj;
       switch(type)
       {
          case C_INT:
            obj.write( *static_cast<int*>(ptr) );
            break;
          case C_STR:
            obj.write( *static_cast<char**>(ptr) );
            break;
          default:
            //Some kind of error.
       }
    }
    
    void write( int type, ... )
    {
       va_list argp;
       va_start( argp, type);
       myclass obj;
       switch(type)
       {
          case C_INT:
            obj.write( va_arg(argp, int) );
            break;
          case C_STR:
            obj.write( va_arg(argp, char* ) );
            break;
          default:
            //Some kind of error.
       }
    }
    
    #define write(X,Y) write(X,Y)