option parser: make assign_default_once work with non-copyable types

This commit is contained in:
Andrzej Rybczak
2014-09-03 11:44:33 +02:00
parent 73773cda98
commit a52bd231cb

View File

@@ -41,19 +41,18 @@ struct option_parser
template <typename ArgT> template <typename ArgT>
assign_value_once(DestT &dest, ArgT &&value) assign_value_once(DestT &dest, ArgT &&value)
: m_assigned(false), m_dest(dest), m_source(std::forward<ArgT>(value)) { } : m_dest(dest), m_source(std::make_shared<source_type>(std::forward<ArgT>(value))) { }
void operator()() void operator()()
{ {
assert(m_assigned == false); assert(m_source.get() != nullptr);
m_dest = std::move(m_source); m_dest = std::move(*m_source);
m_assigned = true; m_source.reset();
} }
private: private:
bool m_assigned; DestT &m_dest;
dest_type &m_dest; std::shared_ptr<source_type> m_source;
source_type m_source;
}; };
template <typename IntermediateT, typename DestT, typename TransformT> template <typename IntermediateT, typename DestT, typename TransformT>