結果を配列メンバーに保持する行列を解析するクラスがあります。
class Parser
{
...
double matrix_[4][4];
};
このクラスのユーザーは、次のようなAPI関数(たとえば、私が制御できない関数のように、インターフェイスを変更して作業を簡単にすることはできません)を呼び出す必要があります。
void api_func(const double matrix[4][4]);
呼び出し元が配列の結果を関数に渡すために私が思いついた唯一の方法は、メンバーをパブリックにすることです。
void myfunc()
{
Parser parser;
...
api_func(parser.matrix_);
}
これが物事を行う唯一の方法ですか?このように宣言された柔軟性のない多次元配列に驚いています。matrix_
私は本質的にaと同じだろうと思っていたのでdouble**
、2つの間で(安全に)キャストできました。結局のところ、私は物事の間でキャストするための危険な方法を見つけることさえできません。Parser
クラスにアクセサを追加するとします。
void* Parser::getMatrix()
{
return (void*)matrix_;
}
これはコンパイルされますが、変な配列型にキャストバックする方法がないように思われるため、使用できません。
// A smorgasbord of syntax errors...
api_func((double[][])parser.getMatrix());
api_func((double[4][4])parser.getMatrix());
api_func((double**)parser.getMatrix()); // cast works but it's to the wrong type
エラーは次のとおりです。
エラーC2440:'型キャスト':'void*'から'const double[4][4]'に変換できません
...興味深い補遺付き:
参照または配列へのポインタへの変換はありますが、配列型への変換はありません
おそらくここでは役に立たないでしょうが、参照または配列へのポインターにキャストする方法も決定できません。
確かに、この時点では、void*
キャストは1人のクラスのメンバーが公開されているよりもきれいではないため、この問題は純粋に学術的なものです。