
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件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
VC++2008でちょいちょいと書いてみました。
下記URL参照。C#から呼び出せることを確認してあります。
参考URL:http://cid-07c558f8e11e708f.skydrive.live.com/se …|_lib.zip
お礼が遅くなり申し訳ありません。
ファイルまでアップしていただきありがとうございます。
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#から利用できます。
またもお答えいただきありがとうございます。
教えていただいたようにやろうとしているのですが、
C++/CLI側の
Test<long>
が出てくる行で何故か
error C2059: 構文エラー : '<'
が出てしまいうまくいきません。
せっかくお答えいただいたのに、
解決に至れず申し訳ありません。
No.1
- 回答日時:
あなたが冒頭で述べたとおりです。
> テンプレート関数やクラスを「明示的実体化」してコンパイルし、
> C++/CLIで「ラップ」すればC#でも使えるという話を聞きました。
この回答への補足
> あなたが冒頭で述べたとおりです。
回答ありがとうございます。
ですが、質問の意図がうまく伝わらなかったようです。すみません。
ラップすれば使えるということは既に分かっております。
知りたいのは、C++のテンプレート関数(クラス)を明示的実体化した後、
C++/CLIでラップするために"どう記述すればよいか"です。
例えば、
C++側で Test という通常クラスを定義してライブラリを作成した場合、
C++/CLI側でも Test というクラス名でインスタンスを作れますが、
C++側で明示的実体化されたテンプレートクラス Test<int> をライブラリにした場合、
C++/CLI側で Test<int> というクラス名を書くと文法エラーになってしまいます。
恐らく、明示的実体化したテンプレート関数(クラス)のコンパイルの際に、
別名がついたか、別名をつける必要があるか、のどちらかではないかと考えているのですが、
具体的にどこにどう書けばよいかが分かりません。
さんざんググったのですが分かりませんでした。
もし御存知でしたら、教えていただければ幸いです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
クラス間でのデータ参照
-
JTable ArrayList 表示されない
-
C#のクラスライブラリでメッセ...
-
visual studioのデザイナ画面で...
-
C#にて別クラスの関数を使いたい
-
Java リフレクションについて
-
関数内の変数に<summary>コメン...
-
a href="..." とServlet
-
内部クラスのインスタンスを外...
-
ASP Pageの孫継承のPage_Load
-
super.paint(g)を呼び出す意...
-
SwingでgetContentPaneのエラー...
-
スーパークラスのインスタンス...
-
c++,ある関数のクラスから別の...
-
範囲外の数値を代入したらエラ...
-
キャストについて教えてください
-
アップキャスト、ダウンキャス...
-
構造 他のクラスの構造体を別...
-
javaでメインクラスが見つから...
-
命名規約について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
クラス間でのデータ参照
-
関数内の変数に<summary>コメン...
-
javaでメインクラスが見つから...
-
範囲外の数値を代入したらエラ...
-
C#にて別クラスの関数を使いたい
-
a href="..." とServlet
-
無名パッケージからのインポート
-
visual studioのデザイナ画面で...
-
import と extends について
-
Java リフレクションについて
-
C#のクラスライブラリでメッセ...
-
C# インターフェイスの実装
-
親クラスから子クラスへアクセス。
-
c++,ある関数のクラスから別の...
-
Java
-
構造 他のクラスの構造体を別...
-
C++で親クラスの関数を呼び出す...
-
C++でfriendクラスにしているの...
-
java-別クラスの変数の使い方を...
-
下記のコードを実行すると、Mai...
おすすめ情報