是否有任何选项可以推迟可变参数模板中函数调用的评估

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); });