Нужно передать аргумент функции без временной переменной
Всем привет!
Мне нужно вызвать функцию таким образом:
nmsp.Operate( Nmsp::Derived{}.SetName( "New Name") );
Поэтому я не могу понять, как это реализовать.
Заранее благодарю вас за вашу помощь.
С. П.
если я использую unique_ptr я получаю ошибку:
Visual studio compiler: Error C2259 'Nmsp::Base': cannot instantiate abstract class
Что я уже пробовал:
#include <iostream> namespace Nmsp { class Base { public: virtual Base& SetName(const std::string& c) = 0; virtual ~Base() = default; virtual void Func(std::ostream& out) const = 0; double param = 1; }; class Derived : public Base { public: Derived() { std::cout << "Derived Ctor" << ", name=" << name << std::endl; } Base& SetName(const std::string& c) override { name = c; param = 2; std::cout << "SetName" << ", New name=" << name << std::endl; std::cout << "SetName" << ", New param=" << param << std::endl; return *this; } void Func(std::ostream& out) const override { out << "Derived param = " << param << std::endl; out << "Derived caption = " << name << std::endl; } ~Derived() { std::cout << "Derived Dtor" << ", name=" << name << std::endl; } std::string name = "Default Name"; }; class Holder //: public Base { public: ~Holder() { if (basePtr) delete basePtr; } template <typename T> void Operate(T& bPtr) { basePtr = &bPtr; //basePtr = std::make_unique<T>(std::move(bPtr)); } void Go(std::ostream& out) { basePtr->Func(out); } private: Base* basePtr = nullptr; // std::unique_ptr<Base> basePtr; }; } int main() { Nmsp::Holder nmsp; Nmsp::Base* pBase = new Nmsp::Derived; *pBase = Nmsp::Derived{}.SetName("New Name"); nmsp.Operate( *pBase ); std::cout << "before go" << std::endl; // Need to call the function Operate() in this way //nmsp.Operate( Nmsp::Derived{}.SetName( "New Name") ); nmsp.Go( std::cout ); return 0; }
Richard MacCutchan
Ваш вопрос не совсем ясен. В чем же заключается реальная проблема?
bartello
Вот реальная проблема: если я использую комментируемую строку в функции main() вместо трех строк (где вызывается функция Operate ()) - код будет работать неправильно.
Richard MacCutchan
- код будет работать неправильно."
Что это значит?