渡されたすべての型のサイズの合計を差し引くことができる、可変個引数テンプレート型パックを使用して構造体テンプレートを作成しようとしています。
以下に簡単な例を示します。実際のコンテキストでは、計算されたサイズを使用してさらにメンバー オブジェクトを作成します。
template <typename... Types>
struct OverallSize
{
template <typename FirstType, typename... NextTypes>
static constexpr size_t sizesum() { return sizeof (FirstType) + sizesum<NextTypes...>(); }
template <typename LastType>
static constexpr size_t sizesum() { return sizeof (LastType); }
static constexpr size_t size = sizesum<Types...>();
};
// Should work e.g. like this
auto s = OverallSize<int, float, char>::size; // s will be 9 on x86-64
引数リストに関しては、この再帰的なパラメーター アンパック アプローチに慣れており、これは引数のない関数や明示的なテンプレート指定でも同様に機能すると想定していました。ただし、clangでコンパイルすると次のエラーが発生します
Call to 'sizesum' is ambiguous
...
Candidate function [with FirstType = unsigned long, NextTypes = <>]
Candidate function [with LastType = unsigned long]
そのため、最後の再帰反復がここでは機能しないように見えます。なぜコンパイラーが最も明白な選択肢を単純に選択しなかったのかはわかりません: テンプレート型が 1 つしかないもの – 実際のテンプレート引数があった場合と同じです。関数に渡されます。
では、これをコンパイルして希望どおりに動作させるにはどうすればよいでしょうか?