<分区>
我找到了 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';
}
}
所以我的第一个问题是,为什么非模板参数在参数包之后不起作用?我做错了什么还是语言禁止这样做?
其次,有什么方法可以获取我正在尝试执行的语法吗?我过度简化了我的示例,但在我的真实代码中 callback
参数实际上是一个 std::function<...>
.这个想法是我可以订阅一些“事件 ID”,并在最后定义回调。将回调放在最后更有利于可读性和风格。示例:
SubscribeMultiple(EventOne, EventTwo, EventThree, [] {
// Implement callback code here when any of the above
// three events are fired.
});
如果我必须在前面有回调,恕我直言,它的可读性较差。所以我愿意尝试任何解决方法来获得我想要的语法和结构。提前致谢。