[Effective modern C ++]中的第34项给出了一个示例,嵌套绑定可以推迟steady_clock::now()
的评估,直到调用setAlarm
为止。
std::chrono::steady_clock::now
实际上是static
成员函数。我的理解是,只要它作为函数参数传递,它就会被评估。
任何人都可以帮忙详细说明为何可以延期吗?
auto setSoundB =
std::bind(setAlarm,
std::bind(std::plus<>(), steady_clock::now(), 1h),
_1,
30s);
答案 0 :(得分:6)
在您的示例中,不会延迟对steady_clock::now()
的调用。
要阻止steady_clock::now()
现在进行评估,请将其包含在另一个bind
来电中:
std::bind(&steady_clock::now)
E.g:
auto mynow() {
std::cout << "mynow\n";
return std::chrono::steady_clock::now();
}
int main(int ac, char**) {
std::cout << "creating a bind object\n";
auto f = std::bind(std::plus<>(), mynow(), 1h);
std::cout << "invoking bind object\n";
f();
std::cout << "\ncreating a bind object\n";
auto g = std::bind(std::plus<>(), std::bind(&mynow), 1h);
std::cout << "invoking bind object\n";
g();
}
输出:
creating a bind object
mynow
invoking bind object
creating a bind object
invoking bind object
mynow
有关详细信息,请参阅std::bind:
成员函数运算符()
如果存储的参数
arg
的类型为T
std::is_bind_expression<T>::value == true
(例如,另一个bind
表达式直接传递给{{1}的初始调用然后bind
执行函数组合:不是传递bind
子表达式将返回的函数对象,而是急切地调用子表达式,并将其返回值传递给外部可调用对象...