有间接函数吗?

Jon*_*Mee 7 c++ functor indirection function-object unary-function

我正在寻找一个一元函子,它将取消引用它的参数并返回结果.当然我可以写一个,它似乎应该已经存在.

所以给出代码:

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; });
Run Code Online (Sandbox Code Playgroud)

Live Example

我希望有一个我可以用而不是lambda的仿函数.这样的事情存在,还是我需要使用lambda?

Vit*_*meo 9

假设"functor"是指"函数对象""可调用对象",在标准库中似乎没有您想要的东西.

自己实现它是微不足道的:

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

请注意,您的lambda不会按预期执行,因为它的隐式返回类型是-> auto复制.一个可能正确的lambda是:

[](const auto& i) -> decltype(auto) { return *i; }
Run Code Online (Sandbox Code Playgroud)

如果没有指定明确的结尾返回类型为拉姆达隐含一个会auto永远的副本.operator*返回引用并不重要,因为lambda返回一个副本(即返回的引用operator*然后由lambda return语句复制).

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

int main()
{
    []{ return *(new A); }(); // prints "copy ctor"
}
Run Code Online (Sandbox Code Playgroud)

wandbox示例

  • 我会使用`decltype(auto)`因此它也适用于返回代理对象的InputIterators (3认同)
  • 参见[`auto`,**(5)**](http://en.cppreference.com/w/cpp/language/auto),它会引导你进入[decltype`规则](http:/ /en.cppreference.com/w/cpp/language/decltype).简而言之,`decltype(x)`保留了`x`表达式的"参考性". (2认同)