假设一个可变参数模板:
void f(T value, Args... args)
作为参数之一传递一个返回值的函数。
示例:f(1,getName());
是否有一种简单的方法来推迟对函数的求值,因此在f()中调用getName(),如果不需要则不执行。
我用一种简单的方法表示最好不要创建复杂的调用语法。
答案 0 :(得分:1)
如果你像你在你的例子中所做的那样调用f,那么f甚至无法知道它是通过函数传递的。只有getName的返回值传递给f。
像这样:
auto x = getName();
f(1, x);
要仅在需要时评估函数,可以传递函数指针:
f(1, getName);
我不太了解变量模板对于这个问题的重要性所以我简化了它:
template <typename T, typename F>
void f(T a, F func)
{
if (required)
result = func();
}
如果要传递调用函数时应该使用的参数,可以使用std :: bind工具或lambda:
f(1, [&]{ return getName(arg1, arg2); });
甚至是来自外部和内部参数的案例f:
template <typename T, typename F>
void f(T a, F func)
{
if (required)
result = func(3.0f);
}
f(1, [&](float otherArg){ return getName(arg1, arg2, otherArg); });