有间接函子吗?
Is There a Indirection Functor?
我正在寻找一个一元仿函数,它将取消引用它的参数和 return 结果。我当然可以写一个,看起来应该已经有了。
所以给定代码:
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; });
我希望有一个仿函数可以用来代替 lambda。是否存在这样的事情,还是我只需要使用 lambda?
假设 "functor" 你的意思是 "function object" 或 "callable object",there doesn't seem to be what you desire in the Standard Library.
自己实现很简单:
struct deferencer
{
template <typename T>
decltype(auto) operator()(T&& x) const
noexcept(noexcept(*x))
{
return *x;
}
};
请注意,您的 lambda 不符合您的预期,因为它的隐式 return 类型是 -> auto
,它会生成一个副本。一种可能的正确 lambda 是:
[](const auto& i) -> decltype(auto) { return *i; }
如果您没有为 lambda 指定显式 尾随 return 类型 ,则隐式类型将为 auto
即 总是一个副本。 operator*
return 是否是引用并不重要,因为 lambda return 是一个副本 (即由 operator*
编辑的引用 return然后由 lambda 的 return
语句复制)。
struct A
{
A() = default;
A(const A&) { puts("copy ctor\n"); }
};
int main()
{
[]{ return *(new A); }(); // prints "copy ctor"
}
我正在寻找一个一元仿函数,它将取消引用它的参数和 return 结果。我当然可以写一个,看起来应该已经有了。
所以给定代码:
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; });
我希望有一个仿函数可以用来代替 lambda。是否存在这样的事情,还是我只需要使用 lambda?
假设 "functor" 你的意思是 "function object" 或 "callable object",there doesn't seem to be what you desire in the Standard Library.
自己实现很简单:
struct deferencer
{
template <typename T>
decltype(auto) operator()(T&& x) const
noexcept(noexcept(*x))
{
return *x;
}
};
请注意,您的 lambda 不符合您的预期,因为它的隐式 return 类型是 -> auto
,它会生成一个副本。一种可能的正确 lambda 是:
[](const auto& i) -> decltype(auto) { return *i; }
如果您没有为 lambda 指定显式 尾随 return 类型 ,则隐式类型将为 auto
即 总是一个副本。 operator*
return 是否是引用并不重要,因为 lambda return 是一个副本 (即由 operator*
编辑的引用 return然后由 lambda 的 return
语句复制)。
struct A
{
A() = default;
A(const A&) { puts("copy ctor\n"); }
};
int main()
{
[]{ return *(new A); }(); // prints "copy ctor"
}