【问题标题】:std::function extract and remove argument [closed]std::function 提取和删除参数 [关闭]
【发布时间】:2015-08-11 19:45:53
【问题描述】:

这些天我在学习 c++11/14,它对我来说似乎是一门全新的语言,有很多很棒的附加功能,但我仍然不能完全利用所有这些新功能:

typedef std::function<void()> void_f;

typedef std::function<void(int a, void_f b)> f1;
typedef std::function<void(int a, std::function<void(void_f f)> c, void_f b)> f2; // this order is wanted

std::vector<f1> v;

void add(f1 f)
{
    v.push_back(f);
}

void add(f2 f)
{
     v.push_back(f) // ?
 // I want to extract 'void_f f' argument from std::function for later use 
//and remove std::function completely to get same signature as f1
}

我一直在查看 std::move、std::bind、std::forward、std::placeholders 但我似乎找不到这样的东西。也许我应该在向量中保存更长的版本,然后为更短的绑定空 lambda?

【问题讨论】:

  • "我想从 std::function 中提取 'void_f f' 参数以供以后使用并完全删除 std::function" 是什么意思?
  • A std::function 是可以用它的参数调用的东西,而不是 参数的东西?
  • 为什么要从std::function中提取函数指针?你希望它能给你带来什么? 注意可能根本没有函数指针
  • 我更新了我的问题,以更好地反映我想要实现的目标。我只想保存在同一个向量支架中,但也重用 std::function 的第二个参数
  • 第二个和第三个 typedef 没有任何意义,不能编译

标签: c++ c++11 c++14 std-function stdbind


【解决方案1】:

不,如果这是你想要的,你可以将“更短”的 f1 保存在向量中:

typedef std::function<void()> void_f;

typedef std::function<void(int a, void_f b)> f1;
typedef std::function<void(int a, std::function<void(void_f f)> c, void_f b)> f2;

std::vector<f1> v;

void add(f1 f)
{
    v.push_back(f);
}

void add(f2 f)
{
     v.push_back([](int a, void_f b) { f(a, [](){}, b); });
} 

您不能“删除”f2 的额外参数,但您可以传递无操作 lambda。外部 lambda 将剩余的参数 a 和 b 按正确的顺序排列。

【讨论】:

  • 那是我首先做的,但随后争论完全消失了。有什么办法可以得到它吗?
  • @juzerKicker:哪个参数丢失了?我们提供一个空的 lambda 作为第二个参数的全部原因是因为一开始就没有参数。 f2 f 需要 3 个参数,vector&lt;f1&gt; 的用户只会提供 2 个参数。
  • std::function 有 f 参数,即 lambda,可能包含手写代码,用法如:c([]{} _some_code_here})。我想在稍后通过调用 no-op lambda 来“删除”它之前保存它。我想我会在调用 c 后立即执行此操作。
  • @juzerKicker:高阶函数可能会令人困惑。 std::function&lt;void(void_f f)&gt; 没有 f 参数,它需要参数。
猜你喜欢
  • 2017-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-21
  • 1970-01-01
  • 2021-07-12
相关资源
最近更新 更多