是否有任何选项可以推迟可变参数模板中函数调用的评估
Is there any option to defer the evaluation of a function call in a variadic template
假设一个可变参数模板:
void f(T value, Args... args)
作为参数之一传递的函数是 returns 一个值。
示例:f(1, getName());
有没有一种简单的方法可以延迟函数的计算,所以 getName() 在 f() 内部调用,如果不需要则不执行。
并且我的意思是简单的方法最好不要创建复杂的调用语法。
如果您像示例中那样调用 f,f 甚至无法知道它被传递给了一个函数。只有 getName 的 return 值被传递给 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); });
假设一个可变参数模板:
void f(T value, Args... args)
作为参数之一传递的函数是 returns 一个值。
示例:f(1, getName());
有没有一种简单的方法可以延迟函数的计算,所以 getName() 在 f() 内部调用,如果不需要则不执行。
并且我的意思是简单的方法最好不要创建复杂的调用语法。
如果您像示例中那样调用 f,f 甚至无法知道它被传递给了一个函数。只有 getName 的 return 值被传递给 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); });