【发布时间】:2012-05-25 05:46:35
【问题描述】:
这是一个使用从Johannes Schaub - litb 和Luc Danton 的答案改编的代码打印元组的简短程序。
#include <iostream>
#include <tuple>
template<int ...>
struct seq { };
template<int N, int ...S>
struct gens : gens<N-1, N-1, S...> { };
template<int ...S>
struct gens<0, S...> {
typedef seq<S...> type;
};
template <int ...S, typename ...T>
void print(const std::tuple<T...> & tup, seq<S...> s) {
int res[] = { (std::cout << std::get<S>(tup) << " ", 0)... };
std::cout << std::endl;
}
int main() {
std::tuple<double, int, char> tup(1.5, 100, 'c');
print(tup, gens<std::tuple_size<decltype(tup)>::value >::type());
return 0;
}
print 的第二个参数总是gens<N>::type(),其中N 是元组的大小。我试图通过提供默认参数来避开要打印的第二个参数:
template <int ...S, typename ...T>
void print(const std::tuple<T...> & tup, seq<S...> s = gens<std::tuple_size<decltype(tup)>::value >::type()) {
int res[] = { (std::cout << std::get<S>(tup) << " ", 0)... };
std::cout << std::endl;
}
但是,结果是编译器错误:
tmp5.cpp: 在函数中'void print(const std::tuple<_elements ...>&, seq) [with int ...S = {}; T = {double, int, char}]':
tmp5.cpp:23:12:错误:嵌套名称说明符中使用的类型“std::tuple_size&>”不完整
你知道有什么方法可以在没有第二个参数的情况下提供S... 给像print 这样的函数吗?
【问题讨论】:
标签: c++ c++11 tuples variadic-templates