【问题标题】:How to make a function that accepts another one with variable arguments如何制作一个接受另一个带有可变参数的函数
【发布时间】:2021-10-06 11:00:17
【问题描述】:

我需要一个像这样工作的函数 My_func

   auto f = [](string s, double c) { return c; };
    assert(My_func(f)(std::make_tuple("Hello", 8.5)) == f("Hello", 8.5'));

现在我有

template <class T>
auto My_func(T&& f) {
    return [f = std::forward<T>(f)](auto&& value) {

    };
}

我应该添加什么?

【问题讨论】:

  • 我应该添加什么? 我想你可以在My_func 中调用f。但这真的取决于你,因为你对要求保密,所以我不知道如何帮助你。
  • 我需要相反的功能
  • 我不知道在这种情况下“相反”是什么意思。对面是什么?
  • link相反

标签: c++ tuples


【解决方案1】:

相信你在找std::apply

#include <cassert>
#include <string>
#include <tuple>

template <class F>
constexpr auto My_func(F&& f) {
    return [f = std::forward<F>(f)](auto&& tuple) mutable {
        return std::apply(std::forward<decltype(f)>(f),
                          std::forward<decltype(tuple)>(tuple));
    };
}
int main() {
    auto f = [](std::string s, double c) { return c; };
    assert(My_func(f)(std::make_tuple("Hello", 8.5)) == f("Hello", 8.5));
}

这本质上只是std::apply 的函子包装器,它仍然很有用,因为它是一个模板,因此无法传递它。

【讨论】:

  • 谢谢@Quimby。我想补充一点,我们不需要在转发“f”之后写``` std::forward(f) ``` before.And 我们应该在(auto&amp;&amp; tuple) 之后写mutable,如果我们希望我们的函数与这样的右值函数一起工作``` My_func(std::move(f))("str", 3.9)) ```跨度>
  • @Art_Uspen 您对缺少的可变变量是正确的,谢谢。需要捕获列表中的forward,否则通过复制捕获将导致仅移动类型的编译器错误。调用内部的转发也需要再次移动捕获值——这就是mutable 的原因。这使得调用很危险,因为函子只工作一次,所以也许它不应该在那里。
猜你喜欢
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 2010-12-15
  • 2011-04-01
相关资源
最近更新 更多