重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

C++で作成したテンプレート関数やテンプレートクラス
をC#で利用したいと考えております。


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

テンプレートでない通常の関数やクラスの場合は、
http://www.atmarkit.co.jp/fdotnet/special/vcppin …
で紹介されているのを見つけたのですが、
テンプレート関数やクラスの場合
具体的に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)です。
よろしくお願いいたします。

A 回答 (3件)

VC++2008でちょいちょいと書いてみました。

下記URL参照。
C#から呼び出せることを確認してあります。

参考URL:http://cid-07c558f8e11e708f.skydrive.live.com/se …|_lib.zip
    • good
    • 0
この回答へのお礼

お礼が遅くなり申し訳ありません。
ファイルまでアップしていただきありがとうございます。

C++側をまずスタティックライブラリにする
場合の方法は結局よく分かりませんでしたが、
UPしていただいたファイルのように
全てC++/CLI側のソースに集めて書く方法もあったのですね。
おかげさまで意図していたことはできそうです。
(実は某画像処理系のC++テンプレートライブラリをC#で使いたかったのです。)
ありがとうございます。

ただ、C++のテンプレート関数で
void func(Test<long> &x)
のような、コンテナが引数の関数をラップする場合、
スマートな方法が思いつかないのですが、
friend関数はマネージ型には使えないようなので、
サンプルにおけるポインタimpl_をpublicにして
void func_w(Test_long^ x){
  func(*(x->impl_));
}
のように実現することになるといったところなのでしょうか。

お忙しいところ、御回答ありがとうございました。

お礼日時:2008/06/09 22:27

> 明示的実体化したテンプレート関数(クラス)のコンパイルの際に、


> 別名がついたか、別名をつける必要があるか、
> のどちらかではないかと考えているのですが、

どちらも違います。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#から利用できます。
    • good
    • 0
この回答へのお礼

またもお答えいただきありがとうございます。

教えていただいたようにやろうとしているのですが、
C++/CLI側の
Test<long>
が出てくる行で何故か
error C2059: 構文エラー : '<'
が出てしまいうまくいきません。

せっかくお答えいただいたのに、
解決に至れず申し訳ありません。

お礼日時:2008/06/07 22:29

あなたが冒頭で述べたとおりです。



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

この回答への補足

> あなたが冒頭で述べたとおりです。
回答ありがとうございます。

ですが、質問の意図がうまく伝わらなかったようです。すみません。
ラップすれば使えるということは既に分かっております。
知りたいのは、C++のテンプレート関数(クラス)を明示的実体化した後、
C++/CLIでラップするために"どう記述すればよいか"です。

例えば、
C++側で Test という通常クラスを定義してライブラリを作成した場合、
C++/CLI側でも Test というクラス名でインスタンスを作れますが、
C++側で明示的実体化されたテンプレートクラス Test<int> をライブラリにした場合、
C++/CLI側で Test<int> というクラス名を書くと文法エラーになってしまいます。

恐らく、明示的実体化したテンプレート関数(クラス)のコンパイルの際に、
別名がついたか、別名をつける必要があるか、のどちらかではないかと考えているのですが、
具体的にどこにどう書けばよいかが分かりません。
さんざんググったのですが分かりませんでした。

もし御存知でしたら、教えていただければ幸いです。

補足日時:2008/06/06 21:58
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!