std::tuple_size で終了する再帰テンプレート (テンプレート構造体の関数) の実装に問題があります。
これがコードの一部です(問題を強調するためにコードを簡略化しました):
template<int index, typename ...T_arguments>
struct Helper
{
static void func (size_t& return_size,
const std::tuple<T_arguments...>& arguments)
{
const auto& argument (std::get<index> (arguments));
return_size += ::value_size (argument);
::Helper<index + 1, T_arguments...>::func (return_size, arguments);
}
// ...
template<typename... T_arguments>
struct Helper<std::tuple_size<T_arguments...>::value, T_arguments...>
{
static void func (size_t& return_size,
const std::tuple<T_arguments...>& arguments)
{
const auto& argument (std::get<std::tuple_size<T_arguments...>::value> (arguments));
return_size += ::value_size (argument);
}
最初のテンプレート呼び出しは次のようになります。
Helper<0, T_arguments...>::func (return_size, arguments);
GCC は次のエラーで失敗します:
エラー: テンプレート引数 'std::tuple_size::value' には、テンプレート パラメーター構造体ヘルパー::値、T_arguments が含まれています...>
std::tuple_size
コンパイル時に既知であると主張されているのに、なぜテンプレートの特殊化を使用できないのですか?