【问题标题】:Calling a function inside an initializer list with an empty parameter pack function argument使用空参数包函数参数调用初始值设定项列表中的函数
【发布时间】:2015-03-13 22:24:53
【问题描述】:

我有

void foo(double &arg, uint8_t *data)
{
    // ...
}

template <class T>
void foo(T &arg, uint8_t *data)
{
    // ...
}

我称之为

template <class ...T>
void bar(T... arg)
{
    uint8_t *data = new uint8_t[SOME_VALUE];

    // guaranteed to be executed in order
    auto list = {(foo(arg, data), 1)...};

   // ...
}

但是当使用 0 个参数调用 bar 时它会失败,因为在初始化列表中调用 foo 的方式。

如何修改它以使bar 使用空参数包?结果应该就像初始化列表从未执行过一样。

当我们在bar 和可变参数模板@ 987654329@ 调用自身,直到其参数包为空。 (主要是因为后者似乎很昂贵——当包有很多参数时,堆栈会下降很多,这会导致生成许多不同的模板版本foo。)

【问题讨论】:

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


    【解决方案1】:

    基本上,问题在于auto list = {}; 不起作用。

    要么明确指定类型:

    std::initializer_list<int> list = {(foo(arg, data), 1)...};
    

    或者给它一个额外的元素:

    auto list = {1, (foo(arg, data), 1)...};
    

    旁注:对于完全通用的代码,当您不知道foo 的返回类型时,您需要将foo 的返回值强制转换为void,以防止可能重载的逗号运算符.

    【讨论】:

    • 哇,这么简单。在这里,我试图找到一种聪明的方法来重载foo,甚至使它成为一个结构。
    • @MooingDuck 这有点正交——你仍然需要添加一个额外的元素来处理空包情况。
    • @T.C.:它是 100% 正交的,如果我不清楚,抱歉:D。这只是可以与此模式一起使用的另一个技巧。,
    猜你喜欢
    • 1970-01-01
    • 2019-02-17
    • 2012-01-07
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    • 2022-09-24
    • 2017-11-19
    • 1970-01-01
    相关资源
    最近更新 更多