Вам нужен вспомогательный объект, например std::less
, но для унарного оператора.
C ++ 11 лямбд делают это невероятно простым:
std::transform(xs.begin(), xs.end(), ys.begin(), [](the_type x){ return -x; });
std::transform(xs.begin(), xs.end(), ys.begin(), [](the_type x){ return !x; });
std::transform(xs.begin(), xs.end(), ys.begin(), [](the_type x){ return ~x; });
Или воспользуйтесь этими гибкими помощниками:
struct negate
{
template<typename T>
auto operator()(const T& x) const -> decltype(-x) { return -x; }
};
struct invert
{
template<typename T>
auto operator()(const T& x) const -> decltype(!x) { return !x; }
};
struct complement
{
template<typename T>
auto operator()(const T& x) const -> decltype(~x) { return ~x; }
};
std::transform(xs.begin(), xs.end(), ys.begin(), negate());
std::transform(xs.begin(), xs.end(), ys.begin(), invert());
std::transform(xs.begin(), xs.end(), ys.begin(), complement());