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 の 2 番目の引数は常に になりますgens<N>::type()
。ここN
で、 はタプルのサイズです。デフォルトの引数を指定することで、print の 2 番目の引数を回避しようとしています。
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...
のような関数に2番目の引数なしで提供する方法を知っていますprint
か?