Как взять 2D-представление Boost.MultiArray в качестве аргумента в функцию? - PullRequest
3 голосов
/ 28 февраля 2012

У меня есть трехмерный массив double с.Я хочу написать простую и универсальную функцию для печати его 2D-срезов.

Код:

#include <cstdio>
#include <boost/multi_array.hpp>

template<class M> // any model of MultiArray concept
void printFloatMatrix(typename M::template array_view<2u>::type matrix) {
    using std::printf;

    for(auto& row : matrix) {
        for(auto& elem : row) {
            printf("%5.3f ", elem);
        }
        printf("\n");
    }
}


int main() {
    typedef boost::multi_array<double,3> data_t;
    data_t test_matrix{data_t::extent_gen()[10][10][2]};
    // ...

    using boost::indices;
    using boost::multi_array_types::index_range;
    printFloatMatrix(test_matrix[ indices[index_range()] [index_range()] [0] ]);
}

С GCC это выдает сообщение об ошибке:

test.cpp: In function ‘int main()’:
test.cpp:24:79: error: no matching function for call to ‘printFloatMatrix(boost::multi_array_ref<double, 3u>::array_view<2u>::type)’
test.cpp:24:79: note: candidate is:
test.cpp:5:6: note: template<class M> void printFloatMatrix(typename M::array_view<2u>::type)

Почемуошибка?

Почему M не выводится как boost::multi_array_ref<double, 3u>?

Как мне написать прототип, который будет работать?

1 Ответ

1 голос
/ 28 февраля 2012

Я не могу описать точную причину, по которой вывод типа C ++ терпит неудачу, но изменение прототипа функции на template<class M> void printFloatMatrix(const M& matrix) сработало.

Прототип теперь бесполезно широк.С большой вероятностью это укусит меня в будущем.Мы надеемся, что эта ситуация будет исправлена ​​с появлением концептов, или, в качестве альтернативы, может быть исправлена ​​с помощью статических утверждений.

Благодаря ##c++ в Freenode.

...