2016-07-20 2 views
1

のCのシンボルの別名を作成します。私は、フォームのCリンケージで多くのラッパーを生成する必要がある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で可変テンプレートを使いたいと思います。

#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もサポートします)。私の結論は、エイリアスを後処理ステップとして追加することです。

したがって、すでにビルドされた共有ライブラリにシンボルエイリアスを追加する方法は問題ですか? (私は「グレップ」「nmの」出力は、マングルされたシンボルを取得することができます)

敬具

+0

関数テンプレートは関数ではなく、別のモジュールがリンクできる名前を持っていません。具体的なテンプレート引数を持つ関数テンプレートのインスタンス化は関数です。私はテンプレートがあなたの探求に役立つとは思わない。テンプレートを使用しないオリジナルの例がはるかに理にかなっています。 –

+1

私の修正をありがとう。テンプレートを使用する動機は、私が更新しようとするプロジェクトに非常に特有です。このプロジェクトは何らかの偽のlibcを生成します。マクロバージョンを使用する場合は、明示的に引数 "NATIVE(name、...)"を設定する必要がありますが、テンプレートは関数が標準ヘッダーですでに宣言されているため、関数名から引数型を推測できます。通常、 "NATIVE(printf、const char *、...)"の代わりに "NATIVE(printf)"を書くことができるようにしたい。 – mattator

+1

いいえ、テンプレートは関数** call **から引数型を推論できます関数名だけ。どのコールが明らかにテンプレートに関する何も知らないCモジュールにあるので、どちらがあなたを助けません。 –

答えて

2

C++関数を呼び出すC結合を有する符号化された関数名の別の種類を作成する必要がありますマクロ。それをインラインにするとパフォーマンスの問題がなくなります。

+0

私の目標はマクロを取り除くことだとは思えません。この新しい中間関数がどのようにマクロを使わずにC++関数にパラメータを渡すことができないのか分かりません。目的が明確でない場合は教えてください。御時間ありがとうございます – mattator

関連する問題