Каковы ограничения использования boost mapped_matrix с std :: unique_ptr? - PullRequest
0 голосов
/ 29 января 2020

Существуют ли какие-либо ограничения при использовании boost mamat_matrix с не копируемыми объектами, такими как std :: unique_ptr? Я нахожусь на VS2017 в режиме C ++ 14.

#include <memory>
#include "boost/numeric/ublas/matrix_sparse.hpp"

class myClass
{
    public:
    myClass() {}
    void myMethod() {}
    /*...*/
};

void f()
{
    boost::numeric::ublas::mapped_matrix<std::unique_ptr<myClass>> SparseValues;
    //SparseValues(0, 0) = std::make_unique<myClass>(); // C2280, is it impossible to assign as the move assignment seems to be missing?
    auto p = std::make_unique<myClass>();
    //SparseValues(0, 0) = std::move(p);                // C2280

    auto a = SparseValues(0, 0);                        // Succeeds?? Expected it to fail, assuming it attempts to create a copy?
    auto &b = SparseValues(0, 0);                       // C4239: warning nonstandard extension used
    //auto c = SparseValues(0, 0).operator()();         // C2280, documentation for operator() says "Returns a reference of the j-th element in the i-th row", so there should be no copy?!
    auto &d = SparseValues(0, 0).operator()();          // Suceeds??
    //auto e = SparseValues(0, 0).ref();                // C2280, ref() is not ducumented but was worth a try
    //auto &f = SparseValues(0, 0).ref();               // C2440

    // OK, it seems not possible to get a reference, so then let's directly try to access an internal object:
    // Check for nullptr:
    //if (!SparseValues(0, 0)) { /*...*/ }              // Test for null: C2678, C2088
    //if (!SparseValues(0, 0)()) { /*...*/ }            // Test for null: C2678, C2088
    //if (!SparseValues(0, 0).ref()) { /*...*/ }        // Test for null: C2240
    //SparseValues(0, 0) = std::make_unique<myClass>(); // Reassign:      C2280
    //SparseValues(0, 0)->myMethod();                   // Call method:   C2819, C2039
    //SparseValues(0, 0)()->myMethod();                 // Call method:   C2819, C2039
    //SparseValues(0, 0).ref()->myMethod();             // Call method:   C2280
    //a = std::move(p);                                 // Assignment:    C2280
    //b = std::move(p);                                 // Assignment:    C2280
    //d = std::move(p);                                 // Assignment:    C2679
}

Так что это выглядит довольно бесполезно для меня! Мои вопросы:

  • Действительно ли mapped_matrix неспособен работать с некопируемыми объектами?
  • Это сделано намеренно (из-за архитектурных проблем) или я должен сообщить об этом в отчете об ошибке?
  • Если, однако, его можно использовать с не копируемыми файлами, как правильно его использовать?
  • Документация mapped_matrix довольно плохая, хм. У кого-нибудь есть другая ссылка, дающая больше информации? Как
    • Каков сценарий использования функтора и ref ()? Верно ли, что ref () гарантирует, что объект в матрице существует (и если это будет созданный по умолчанию объект)?
    • В чем разница между типом "reference", возвращаемым функтором, и " true_refrence "возвращено методом insert_element ()? Похоже, реализация проходит через все это?
    • Каков сценарий использования метода assign_teilitary ()?

Мой обходной путь, конечно, заключается в использовании std :: shared_ptr, там компилируется без проблем ...

...