お世話になります。
現在、C#からC++/CLIへコード変換をおこなっているのですが
C#のis演算子をC++/CLIでどのように記述したらよいか悩んでいます。
----------------------------------------------------------------
C#側
if (obj is string)
{
}
オブジェクトが string 型と互換性かあるかどうか
-----------------------------------------------------------------
C++/CLIで上記のようなis演算子に変わるやり方がありましたら
教えて頂けると助かります。
GetType、typeidを使う。
Sample)
System::Object^ o;
o = gcnew System::String(Lほげ);
//o = 1;
if (o->GetType() == String::typeid) {
Console::WriteLine(String);
}
else if (o->GetType() == Int32::typeid) {
Console::WriteLine(int);
}
return 0;
>>Blueさん
さっそく試してみたところ上手く行きました。書き方が分からなかったので
大変助かりました。
そこでもう1つあるのですが
C#でbaseというものがあるのですがbase キーワードを使用すると、基本クラスの
Getinfo メソッドを派生クラス内で呼び出すことができます。
C#のとあるクラスとメソッド
public class Channel<T> : ChannelFactory<T>
{
public AAAAA(string bbb) : base(typeof(T))
{
}
}
このbaseはC++/CLIではどのような表現になるのでしょうか?
うーん、分からない部分を聞くのは良いのですけれど、
入門書を見れば書いて有りそうな話なので、
一度は入門書等で確認すべきではないかなと思いますが。
C++言語なら中括弧の中で親クラス名::Getinfoで呼び出すと思いますけれど。
そういう意味ではないのかなぁ?
__super?
どっちにせよコンストラクタでは使えないから、親クラス名を記述したほうが
統一がどれる気がする。
using namespace System;
generic<typename T>
ref class Hoge
{
public:
Hoge(String^ s) {}
void Func() { Console::WriteLine(LHoge::Func); }
};
generic<typename T>
ref class Moge : public Hoge<T>
{
public:
Moge(String^ s) : Hoge(s) {}
void Func() { __super::Func(); } // Hoge::Func(); でも可
};
int main(array<System::String ^> ^args)
{
Moge<int>^ m = gcnew Moge<int>(L");
m->Func();
return 0;
}
最初の質問についてですが、dynamic_cast を使った方が
C# の is 演算子に近い IL にコンパイルしてくれるようです。
使用例は下記ページの dynamic_cast_clr.cpp
http://msdn.microsoft.com/en-us/library/cby9kycs(VS.100).aspx
各言語のキーワードの比較はこちらです。
http://msdn.microsoft.com/ja-jp/library/zwkz3536.aspx
C#のBaseはC++/CLIでは__superを使うのですね!
自分なりに理解するのに時間がかかってしまい返信が遅くなりました。
入門書は一通り目を通したのですが読んだ入門書が悪いのかこの辺の
コンバートについての記載がなかったので質問させて頂いた次第です。
今回は大変勉強になりました。