の射影関数を探していstd::tuple
ます。つまり、関数はテンプレート パラメータとして整数のリストを受け取り、これらのインデックスの値のみを持つタプルを返します。
たとえば、 タプル があるとします。tuple<int,String,char,float> t
を呼び出すとproject<1,3>(t)
タイプ のタプルになりtuple<String,float>
ます。
もちろん、キーは再帰的なテンプレートのようです。しかし、私はそれを機能させることができません。射影演算の戻り値の型を計算する構造体を宣言することから始めてみました。それでも失敗します。これが私が試したものです:
template<typename T, size_t... indexes>
class Projection{
};
// Specialization for no index => Empty tuple
template<>
template<typename... T>
class Projection<std::tuple<T...>>{
typedef std::tuple<T...> InputTuple;
typedef std::tuple<> Tuple;
};
// Specialization for one or more parameters
template<size_t Index1, size_t... others>
template<typename... T>
class Projection<std::tuple<T...>,Index1,others...>{
typedef std::tuple<T...> InputTuple;
// The type of a projection with one column less
typedef Projection<std::tuple<T...>,others...> TupleMinusOne;
// The result type is the catenation of TupleMinusOne plus the column projected in this step
typedef decltype(std::tuple_cat(std::make_tuple(std::get<Index1>(InputTuple())),typename TupleMinusOne::Tuple())) Tuple;
};
これはコンパイルされます。空のタプルを使用した基本ケースも機能します。つまり、次のようになります。
Projection<std::tuple<int,std::string>>::Tuple t;
t
空のタプルになります。ただし、再帰ケースはコンパイルされません。
Projection<std::tuple<int,std::string>,1>::Tuple t;
次のエラーが表示されます。
Test.cpp:79:1: error: ‘Tuple’ is not a member of ‘Projection<std::tuple<int, float>, 1ul>’
再帰ケースが認識されないようですが、なぜですか?