7

我正在寻找一个一元仿函数,它将取消引用它的参数并返回结果。我当然可以写一个,只是好像有些东西应该已经存在了。

所以给定代码:

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; });

Live Example

我希望有一个可以用来代替 lambda 的仿函数。这样的事情是否存在,还是我只需要使用 lambda?

4

1 回答 1

9

假设“函子”是指“函数对象”“可调用对象”标准库中似乎没有您想要的

自己实现它很简单:

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

请注意,您的 lambda 不会按照您的预期执行,因为它的隐式返回类型是-> auto,它会生成一个副本。一种可能的正确 lambda 是:

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

如果您没有为 lambda 指定显式尾随返回类型,则隐式返回类型将始终auto一个 copy。是否返回引用无关紧要operator*,因为 lambda 返回一个副本(即返回的引用operator*随后被 lambda 的return语句复制)

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

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

魔杖盒示例

于 2017-01-05T14:21:32.390 回答