• 締切済み

C++のテンプレート関数やテンプレートクラスをC#で利用するには?

C++で作成したテンプレート関数やテンプレートクラス をC#で利用したいと考えております。 テンプレート関数やクラスを明示的実体化してコンパイルし、 C++/CLIでラップすればC#でも使えるという話を聞きました。 テンプレートでない通常の関数やクラスの場合は、 http://www.atmarkit.co.jp/fdotnet/special/vcppinvista01/vcppinvista01_01.html で紹介されているのを見つけたのですが、 テンプレート関数やクラスの場合 具体的にC++/CLI側でどのように記述すればよいか分かりません。 例えば、 ---- [test.h] template <class Type1> class Test{ public:   Type1 x;   template <class Type2>   Type1 func(Type2 y){ ... } }; ----- のようなクラスがあった場合、どうすればよいでしょうか。 明示的な実体化の方法とC++/CLIで明示的実体化した関数やクラスが どのような名前になるのかが分かれば上記サイトの方法で いけるのではないかと思っているのですが…。 環境はVisual Studio2005(or 2008)です。 よろしくお願いいたします。

みんなの回答

回答No.3

VC++2008でちょいちょいと書いてみました。下記URL参照。 C#から呼び出せることを確認してあります。

参考URL:
http://cid-07c558f8e11e708f.skydrive.live.com/self.aspx/WillBeRemovedSoon/CppCLI|_lib.zip
hirogo
質問者

お礼

お礼が遅くなり申し訳ありません。 ファイルまでアップしていただきありがとうございます。 C++側をまずスタティックライブラリにする 場合の方法は結局よく分かりませんでしたが、 UPしていただいたファイルのように 全てC++/CLI側のソースに集めて書く方法もあったのですね。 おかげさまで意図していたことはできそうです。 (実は某画像処理系のC++テンプレートライブラリをC#で使いたかったのです。) ありがとうございます。 ただ、C++のテンプレート関数で void func(Test<long> &x) のような、コンテナが引数の関数をラップする場合、 スマートな方法が思いつかないのですが、 friend関数はマネージ型には使えないようなので、 サンプルにおけるポインタimpl_をpublicにして void func_w(Test_long^ x){   func(*(x->impl_)); } のように実現することになるといったところなのでしょうか。 お忙しいところ、御回答ありがとうございました。

回答No.2

> 明示的実体化したテンプレート関数(クラス)のコンパイルの際に、 > 別名がついたか、別名をつける必要があるか、 > のどちらかではないかと考えているのですが、 どちらも違います。C++のclassはnativeであり、そのままでは .NETから呼び出すことはできず、managedでラップしなければなりません。 なのでたとえば: public ref class Test_long {  Test<long>* impl_; public:  Test_long(long arg) { impl_ = new Test<long>(arg); }  ~Test_long() { this->!Test_long(); }  !Test_long() { delete impl_; }  long func_int(int y) { return impl_->func(y); } }; のようなmanaged-classをC++/CLI側で用意しアセンブリを生成すれば C#から利用できます。

hirogo
質問者

お礼

またもお答えいただきありがとうございます。 教えていただいたようにやろうとしているのですが、 C++/CLI側の Test<long> が出てくる行で何故か error C2059: 構文エラー : '<' が出てしまいうまくいきません。 せっかくお答えいただいたのに、 解決に至れず申し訳ありません。

回答No.1

あなたが冒頭で述べたとおりです。 > テンプレート関数やクラスを「明示的実体化」してコンパイルし、 > C++/CLIで「ラップ」すればC#でも使えるという話を聞きました。

hirogo
質問者

補足

> あなたが冒頭で述べたとおりです。 回答ありがとうございます。 ですが、質問の意図がうまく伝わらなかったようです。すみません。 ラップすれば使えるということは既に分かっております。 知りたいのは、C++のテンプレート関数(クラス)を明示的実体化した後、 C++/CLIでラップするために"どう記述すればよいか"です。 例えば、 C++側で Test という通常クラスを定義してライブラリを作成した場合、 C++/CLI側でも Test というクラス名でインスタンスを作れますが、 C++側で明示的実体化されたテンプレートクラス Test<int> をライブラリにした場合、 C++/CLI側で Test<int> というクラス名を書くと文法エラーになってしまいます。 恐らく、明示的実体化したテンプレート関数(クラス)のコンパイルの際に、 別名がついたか、別名をつける必要があるか、のどちらかではないかと考えているのですが、 具体的にどこにどう書けばよいかが分かりません。 さんざんググったのですが分かりませんでした。 もし御存知でしたら、教えていただければ幸いです。

関連するQ&A

専門家に質問してみよう