C ++ functor std::plus
is implemented as
template<typename T>
struct plus
{
constexpr T operator+(const T& lhs, const T& rhs) const
{ return lhs+rhs; }
};
but there is also specialization
template<>
struct plus<void>
{
template< class T, class U>
constexpr auto operator()(T&& lhs, U&& rhs) const
-> decltype(std::forward<T>(lhs) + std::forward<U>(rhs))
{ return std::forward<T>(lhs) + std::forward<U>(rhs); }
};
which has the advantage that it can work on any type, even different types, as long as it is defined T+U
(for example, std::string
and const char*
).
I was wondering why struct std::plus
it is not defined as a non-template with existing functionality std::plus<void>
? Are there any possible applications that cannot be satisfied with such an implementation?
Of course, this may have historical reasons (so it cannot be changed). But if this is the only reason, have you failed to change the default template argument to void
?
template<typename T=void> struct plus;
. , cppreference plus<T>
plus<void>
++ 14.
, plus<void>::operator+
C98 ++,
struct plus
{
template<class T>
T operator()(const T&lhs, const T&rhs) const
{ return lhs + rhs; }
};
, plus<T>
, . ? / ? ( " , " )