#include #include #include class Resource { public: explicit Resource(const std::string& str): str_(str) {} const std::string& str() const { return str_; } private: std::string str_; }; class Converter { public: Converter() = default; // Rule of 5 virtual ~Converter() = default; Converter(const Converter& other) = default; Converter(Converter&& other) = default; Converter& operator=(const Converter& other) = default; Converter& operator=(Converter&& other) = default; virtual void Convert(const std::unique_ptr& resource) const = 0; }; class CurlyBracketConverter : public Converter { public: void Convert(const std::unique_ptr& resource) const override { std::cout << "{" << resource->str() << "}\n"; } }; class SquareBracketConverter : public Converter { public: virtual void Convert(const std::unique_ptr& resource) const override{ std::cout << "[" << resource->str() << "]\n"; } }; class Printer { public: explicit Printer(std::unique_ptr&& converter) noexcept : converter_(std::move(converter)) {} void Print(const std::unique_ptr& resource) const { converter_->Convert(resource); } private: std::unique_ptr converter_; }; struct Foo { Foo(std::unique_ptr ptr); }; struct Bar { use(std::unique_ptr ptr); }; struct MockFoo {}; TEST() { std::unique_ptr mock; MockFoo* mock_ptr = mock.get(); Bar bar; bar.use(std::move(mock)); EXPECT_CALL(mock_ptr, use); } int main() { auto resource = std::make_unique("Ala has a cat"); Printer printer(std::make_unique()); Printer printer2(std::make_unique()); printer.Print(resource); printer2.Print(resource); return 0; }