Есть ли функтор косвенного действия?

Я ищу унарный функтор, который разыменует его аргумент и возвращает результат. Конечно, я могу написать один, просто казалось, что что-то уже должно существовать.

Итак, учитывая код:

const auto vals = { 0, 1, 2, 3 };
vector<const int*> test(size(vals), nullptr);

iota(begin(test), end(test), data(vals));

transform(cbegin(test), cend(test), ostream_iterator<int>(cout, " "), [](const auto& i){ return *i; });

Живой пример

Я надеялся, что есть функтор, который я мог бы использовать вместо лямбды. Существует ли такая вещь, или мне нужно просто использовать лямбду?

6

Решение

Предполагая, что «функтор» ты имеешь в виду «функциональный объект» или же «вызываемый объект», в стандартной библиотеке, кажется, нет того, чего вы хотите.

Это легко реализовать самостоятельно:

struct deferencer
{
template <typename T>
decltype(auto) operator()(T&& x) const
noexcept(noexcept(*x))
{
return *x;
}
};

Обратите внимание, что ваша лямбда не делает то, что вы ожидаете, так как ее неявный тип возврата -> auto, который делает копию. Одним из возможных правильных лямбда является:

[](const auto& i) -> decltype(auto) { return *i; }

Если вы не укажете явное конечный тип возврата для лямбды неявный будет auto который всегда копия. Не имеет значения, если operator* возвращает ссылку, так как лямбда возвращает копию (т.е. ссылка, возвращенная operator* затем копируется лямбда return заявление).

struct A
{
A() = default;
A(const A&) { puts("copy ctor\n"); }
};

int main()
{
[]{ return *(new A); }(); // prints "copy ctor"}

пример wandbox

9

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]