考虑一个例子:
#include <iostream>
#include <tuple>
#include <utility>
template <class... Ts, size_t... Is>
void foo(std::tuple<Ts...> t,
std::index_sequence<Is...> = {}) {
if (sizeof...(Ts) != sizeof...(Is)) {
foo(t, std::make_index_sequence<sizeof...(Ts)>{});
return;
}
(std::cout << ... << std::get<Is>(t));
}
int main() {
foo(std::make_tuple(1, 2, 3));
}
我假设函数foo
的第二个参数的类型默认推导为std::integral_sequence<std::size_t>
,因此我不必创建辅助函数来使用Is...
索引元组元素,但可以调用foo
,第二个参数设置为std::make_index_sequence<sizeof...(Ts)>{}
。
当涉及参数包时,参数包的参数类型是否可以依赖于空包,或者它是否会导致未定义的行为?
使用g++-6
和clang++-3.6
使用-std=c++1z
选项编译的上述代码正在按预期工作。
答案 0 :(得分:1)
是。你依赖于[temp.arg.explicit]:
未以其他方式推导出的尾随模板参数包(14.5.3)将被推导为空的模板参数序列。
什么构成&#34;尾随模板参数包&#34;实际上从来没有完全正确定义,但所有编译器都在这里解释None
。
那就是说,我不会依赖于此,不是因为它不正确,而是因为它使代码难以理解。特别是因为在这种情况下,可以轻松地提取lambda的所有元素:Is...
:
std::apply()