2014-01-22 3 views
1

Я изо всех сил, чтобы превратить этот кусок кода в однострочника:Pass Rvalue по ссылке

std::string filename = "cats"; 
std::shared_ptr<bmd2::Bmd2Dataset> ptr (new bmd2::Bmd2Dataset(filename, bmd2::File::FM_WRITE)); 
bmd2::bmd2Session::getInstance().addDataset(ptr); 

выше прекрасно работает - но я могу назвать addDataset без создания lvalues ​​(строки 1 + 2) ?

Вот декларация addDataset():

int addDataset(std::shared_ptr<bmd2::Bmd2Dataset> &) throw (bmd2Exception); 

ответ

3
bmd2::bmd2Session::getInstance().addDataset(
    std::make_shared<bmd2::Bmd2Dataset>("cats", bmd2::File::FM_WRITE) 
); 

Один statementer. :)

Интересно. В целях обучения вы можете сказать мне, можете ли вы выполнить это без вызова функции make_shared()?

Вы можете использовать синтаксис синтаксиса привязки C++ 11. Предполагая, что addDataset не шаблон и имеет std::shared_ptr<bmd2::Bmd2Dataset> в качестве параметра,

bmd2::bmd2Session::getInstance().addDataset(
    { new bmd2::Bmd2Dataset("cats", bmd2::File::FM_WRITE) } 
); 

UPDATE: К сожалению. Итак, addDataset() действительно принимает l-value ссылка Почему вы не сказали так сразу?. addDataset() параметр не может связываться с параметрами r-значения, которые в двух приведенных выше примерах. Чтобы решить эту проблему, вы можете:

  • addDataset() «s параметр Внести const ссылка

    int addDataset(const std::shared_ptr<bmd2::Bmd2Dataset> &) throw (bmd2Exception); 
    //    ^^^^^ 
    

    ли это, если вам не нужно, чтобы изменить принятый shared_ptr аргумент (то есть изменить его, так это указывает на другой объект).

  • Используйте свой старый метод, , хотя прямо передавая "cat" в выражение new . ОБНОВЛЕНИЕ: Используйте std::make_shared!

    auto ptr = std::make_shared<bmd2::Bmd2Dataset>("cats", bmd2::File::FM_WRITE); 
    bmd2::bmd2Session::getInstance().addDataset(ptr); 
    // ptr might now point to some other object 
    

    ли это, если вы хотите (ptr) значение пройденного аргумента должны быть изменены (т.е. после вызова теперь может указывать на новый объект).

+0

Интересно. В целях обучения вы можете сказать мне, можете ли вы выполнить это без вызова функции make_shared()? –

+0

Я пробовал ваш пример, и компилятор дает ошибку, что функция addDataset() не вызывается с правильными аргументами: Недопустимые аргументы: int addDataset (std :: shared_ptr &) ' , С другой стороны, мой код не вызывает эту ошибку. Я обновил свой вопрос, чтобы показать вам объявление функции addDataset(). –

+0

Это был такой отличный ответ. Спасибо большое. Благослови твою душу: D –

Смежные вопросы