c++ - 函数中参数包后的参数

标签 c++ variadic-templates

<分区>

我找到了 one question在 SO 上,似乎在问与我相同或相似的问题,但没有答案:-(

我想在参数包之后放置一个非模板参数。我不太熟悉可变参数模板/参数包的 C++ 标准规范,但我的常识假设告诉我传递给函数的最右边的参数将首先填充到放置参数中,然后将其余的填充到参数包。但是,我无法让我的测试代码在 g++ 或 clang++ 上运行。下面的示例代码。

#include <vector>
#include <iostream>

int Subscribe(int channel, int callback)
{
    return channel;
}

// This one works fine...
template<typename... T>
std::vector<int> SubscribeMultiple1(int callback, T&&... channels)
{
    return {
        Subscribe(std::forward<T>(channels), std::move(callback))...
    };
}

// This one does not work; all I did was move `int callback` after the parameter pack.
template<typename... T>
std::vector<int> SubscribeMultiple2(T&&... channels, int callback)
{
    return {
        Subscribe(std::forward<T>(channels), std::move(callback))...
    };
}

int main()
{
    auto subs = SubscribeMultiple2(1, 2, 3);

    for (auto sub : subs)
    {
        std::cout << "Sub: " << sub << '\n';
    }
}

Live Sample

所以我的第一个问题是,为什么非模板参数在参数包之后不起作用?我做错了什么还是语言禁止这样做?

其次,有什么方法可以获取我正在尝试执行的语法吗?我过度简化了我的示例,但在我的真实代码中 callback参数实际上是一个 std::function<...> .这个想法是我可以订阅一些“事件 ID”,并在最后定义回调。将回调放在最后更有利于可读性和风格。示例:

SubscribeMultiple(EventOne, EventTwo, EventThree, [] {
    // Implement callback code here when any of the above
    // three events are fired.
});

如果我必须在前面有回调,恕我直言,它的可读性较差。所以我愿意尝试任何解决方法来获得我想要的语法和结构。提前致谢。

最佳答案

Am I doing something wrong or is this prohibited by the language?

仅当包是最后一个参数时才会推导参数包。

[temp.deduct.type]/5.7 :

The non-deduced contexts are:

  • [...]
  • A function parameter pack that does not occur at the end of the parameter-declaration-list.

所以这是标准 C++ 的正常行为。

is there any way to get the syntax I'm trying to do?

使用第一种语法作为解决方法:

   template<typename... T>
   std::vector<int> SubscribeMultiple1(int callback, T&&... channels)

关于c++ - 函数中参数包后的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42026891/

相关文章:

c++ - 可以使用松弛的内存顺序来观察条件吗?

c++ - mbed 中的 Hello World MQTT 程序

c++ - constexpr 可变参数模板和解包 std::array

c++ - C++11 中的可变参数模板和多重继承

c++ - 尝试将参数包的第一个元素作为函数调用并将包的其余部分作为参数传递给它

c++ - 如何使用 SSE2 向量化距离计算

c++ - 使用 C++ 的 Directx11 渲染不工作

c++ - 这会遇到关于对象生命周期的未定义行为吗?

c++ - 通过可变参数模板调用函数指针作为模板参数

c++ - 无法推断可变参数模板的模板类型