У меня есть класс для разбора матрицы, которая сохраняет результат в элементе массива:
class Parser
{
...
double matrix_[4][4];
};
Пользователь этого класса должен вызвать функцию API (как, в функции, которую я не контролирую, поэтому я не могу просто изменить свой интерфейс, чтобы сделать работу более легкой), которая выглядит так:
void api_func(const double matrix[4][4]);
Единственный способ, с помощью которого вызывающий объект передал результат массива функции, - это сделать публичный элемент:
void myfunc()
{
Parser parser;
...
api_func(parser.matrix_);
}
Это единственный способ сделать что-то? Я поражен тем, как объявлены такие негибкие многомерные массивы. Я думал, что matrix_
будет по существу тем же самым, что и double**
, и я мог бы сделать (безопасно) между ними. Как оказалось, я даже не могу найти небезопасный способ бросить между вещами. Предположим, что добавить класс доступа к классу Parser
:
void* Parser::getMatrix()
{
return (void*)matrix_;
}
Это скомпилируется, но я не могу его использовать, потому что, похоже, не существует способа вернуть массив типов weirdo:
// 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 to the wrong type
Ошибка:
error C2440: 'type cast': не может преобразовать из 'void *' в 'const double [4] [4]'
... с интригующим добавлением:
Нет никаких преобразований в типы массивов, хотя есть ссылки на ссылки или указатели на массивы
Я не могу определить, как отбрасывать ссылку или указатель на массив, хотя это, вероятно, мне не поможет.
Конечно, на данный момент вопрос носит чисто академический характер, поскольку приведения void*
вряд ли более чисты, чем один член класса, оставленный публичным!