【发布时间】:2014-01-21 02:14:15
【问题描述】:
std::bind 有时被描述为“部分应用程序”。为什么当一个函数的所有参数都被绑定时,函数本身没有被应用?
例如,以下代码不打印任何内容。
#include <functional>
#include <iostream>
using namespace std;
using namespace std::placeholders;
void f(int a,string b) {cout << a << b << endl;};
int main() {
bind(bind(f,1,_1),"Hi!");
return 0;
}
有没有办法编写一个绑定变体,可以在所有参数都固定的情况下应用该函数?
--更新--
我现在从回复中了解到std::bind 并不完全是部分应用程序。所以,在问题的第二部分,我怎么能写像 std::bind 这样的东西,但做部分应用。
我知道bind(bind(f,1,_1),"Hi!")() 将调用最终的0 元函数并返回结果值(在示例中打印1Hi)。是否可以做模板编程在bind的终端情况下调用函数调用operator()?
也就是说,能不能写一个函数bind1:
template< class R, class F, class... Args >
bind1( F f, Args... args )
,这样当std::is_placeholder<T>::value == 0 为args 的每个成员时,
bind1() 除了std::bind() 所做的之外,还可以调用operator() 吗?
【问题讨论】:
-
绑定 3 个参数中的 1 个,得到 3-1=2 个参数的函数。绑定 3 个参数中的 2 个,得到 3-2=1 个参数的函数。绑定 3 个参数中的 3 个,得到一个 3-3=0 个参数的函数。让
bind有时返回一个函数对象,有时返回其他东西会令人惊讶,特别是如果您正在创建函数以便调用它以获取其副作用。 -
我不这么认为。 Bind 按照名称执行。它绑定。它不执行。你只是得到一个参数更少的仿函数。这是对正在发生的事情的简单、非技术性的描述。
-
是时候决定你的问题是什么了……你真的需要回答你最后一个问题吗?
-
是的,会很方便。在 Haskell 等其他语言中,您可以将参数部分应用于函数,一次又一次地执行此操作,...,当应用所有参数时,您会得到一个值。我认为类似的东西会很有用。
-
我想这就是为什么
bind被称为bind而不是curry。此外,您应该再次阅读std::bind上的文档 - 您使用不正确。你想要bind(bind(f,1,_1),"Hi!")。