是否有任何选项可以在可变参数模板中推迟对函数调用的求值

时间:2015-02-01 16:08:16

标签: c++ c++11 lazy-evaluation variadic-templates

假设一个可变参数模板:

void f(T value, Args... args)

作为参数之一传递一个返回值的函数。

示例:f(1,getName());

是否有一种简单的方法来推迟对函数的求值,因此在f()中调用getName(),如果不需要则不执行。

我用一种简单的方法表示最好不要创建复杂的调用语法。

1 个答案:

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