- くだすれC++/CLI(初心者用)part2
883 :デフォルトの名無しさん[sage]:2014/12/15(月) 20:00:30.77 ID:JoQajMNA - 質問です。
任意の型のマネージド配列(cli::array)を、任意の個数、引数として受け取って それらの配列としての長さの最小値を返す関数を書きたいと思っています。 イメージとしては、 array<String^> arrStr = gcnew array<String^>(6); array<double> arrDob = gcnew array<double>(8); array<int> arrInt = gcnew array<int>(3); に対して、 Function(arrStr, arrDob) = 6 Function(arrStr, arrDob, arrInt) = 3 となるような関数Functionを書きたいと思っています。 しかし、この場合の引数リストの書き方がよくわかりません。 単純に可変長の引数リストだとFunction(... array<Object^>^ args)みたいな 書き方になると思うんですが、これをマネージド配列の配列だからといって 真似てFunction(... array<array<Object^>^>^ arrays)みたいな書き方をしても、 呼び出し側(例えばFunction(arrStr, arrDob)とか)で引数リストが一致しない旨 怒られます。このような場合の適切な引数リストの書き方ってありますか? あるいは回避策として、引数はFunction(... array<Object^>^ args)としておき この関数の中でfor each (Object^ arg in args) { argが配列かどうか }という コードもありえますが、肝心の、「argが配列かどうか」チェックするコードが わかりません。 上記いずれか一方で構いませんので、解決策をご教授いただけないでしょうか?
| - くだすれC++/CLI(初心者用)part2
885 :デフォルトの名無しさん[sage]:2014/12/15(月) 22:28:59.04 ID:JoQajMNA - >>884
試してみましたが、いずれの場合もコンパイルエラーC3132が発生します。 そもそもargの型を何に指定すべきなのか、というのがよくわかっていません。 例えば int Function(... array<Object^>^ args) { int MinLength = -1; for each(array<Object^>^ arg in args) { if ( (MinLength < 0) || (arg->Length < MinLength) ) { MinLength = arg->Length; } } return MinLength; } みたいなコードだと、Function(arrStr, arrInt)を実行したとき、それら引数を System.Object[]にキャストできない旨を怒られます。
| - くだすれC++/CLI(初心者用)part2
887 :デフォルトの名無しさん[sage]:2014/12/15(月) 22:49:54.98 ID:JoQajMNA - >>886
うまくいきました! 動作版のコードは以下の通りです。 int Function(... array<System::Array^>^ args) { int MinLength = -1; for each(auto arg in args) { if ( (MinLength < 0) || (arg->Length < MinLength) ) { MinLength = arg->Length; } } return MinLength; } ありがとうございました。
|
|