Clarify scalar operator() signature in MultiScalarTransform
For each 'row' processed, MultiScalarTransform
expects an
optional<tuple<Out::value_type...>>
to indicate whether it should
append the result to its output vectors, or skip this entry.
The original code could have been interpreted as accepting a
tuple<Out::value_type...>*
, which would result in leaked memory (at best).
With this commit, this (erroneous) code will no longer compile.
In addition, allow tuple<Out::value_type...>
as return type which
implies an unconditional append to the outputs for each row in the
input(s).
Finally, instead of hardwiring boost::optional<T>
as the above mentioned
optional, define an optional<T>
as a value which can be cast to bool (note:
where as std::optional::has_value()
exist, boost::optional::has_value()
requires
boost 1.68 or later -- hence for compatibility with earlier versions of
boost, the explicit conversion to bool is checked instead), and which has a
value()
member function. This allows the use of std::optional
in
C++17 code without having to mention it, i.e. whilst keeping the source
code compatible with C++14...