1

一部の C++ メソッドを公開する共有ライブラリを作成しようとしています。

extern "C" リンケージを使用してメソッドを C 関数として公開するラッパーを作成するだけです。

対応する C 関数内で、クラスのオブジェクトを作成し、適切なメソッドを呼び出します。

私が抱えている問題は、テンプレートを引数として使用する公開する必要があるメソッドの一部です。

例: C++:

class myclass {
    template <typename T>
    void write(int addr, T data);
    void get_data()
}

C ラッパー:

void get_date() {
    myclass obj;
    obj.get_data();
}

他のメソッドを公開するにはどうすればよいですか?

  1. C ラッパー関数で typeid 演算子を使用して、引数の型を判別できますか?
  2. これに関する他のより良いアイデアはありますか?
4

1 に答える 1

3

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.
   }
}

最後のオプションは、var args 関数を使用していくつかのトリックを行うことです。

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)

これは、間違った数の引数を使用するとエラーが発生することを意味します。

于 2012-10-31T06:29:34.353 に答える