Tento criar uma classe não copiável e não móvel, cuja construção de objetos só deve ser feita através de uma função create em vez de construtores públicos. A função create retornará um std::expected
objeto contendo o objeto criado ou um objeto de erro. Para impor a construção por meio da função create, quero tornar privados todos os construtores disponíveis. O objetivo principal desta abordagem é a construção de objetos sem exceções.
Aqui está um exemplo simples:
class Foo
{
int val_{};
public:
Foo() = delete;
Foo(const Foo&) = delete;
Foo& operator=(const Foo&) = delete;
static auto
create(int val) noexcept -> std::expected<Foo, std::error_code>
{
if (val == 42)
return std::unexpected<std::error_code>(std::in_place, EINVAL, std::generic_category() );
return std::expected<Foo, std::error_code>{ std::in_place, val };
}
private:
friend class std::expected<Foo, std::error_code>;
explicit Foo(int val) noexcept
: val_{ val }
{};
};
Observe que fiz std::expected<Foo, std::error_code>
um friend
para permitir que ele chame o construtor privado. Mas ainda recebo um erro do compilador. Aqui está o código no Compiler Explorer .
Você pode usar
expected::transform
:Demonstração