事前定義されたタイプのセットをサポートし、使用可能なタイプのどれが現在アクティブであるかを示す列挙を提供する、かなり単純なバリアント クラスがあります。このようなもの:
class variant
{
enum class type { integer, real, string, etc };
type active_type() const;
/* ... */
};
サポートされている型がテンプレート パラメーターとして提供されるテンプレートにクラスを作成したいと思います。
template <typename... T>
class variant
{
const std::type_info& active_type() const; // logical, but can't switch on it
/* ... */
};
エラーをキャッチするために私が依存している重要な機能はswitch
、アクティブな型を使用できることです。コンパイラは、可能なケースのいずれかが見逃された場合に警告を発します。これは、上記の設計を使用して (または を使用してboost::variant
) 行うことはできません。
私の質問は、パラメーター パック内の引数の数と同じ数の列挙型を持つ列挙型を自動的に生成する方法はありますか?
列挙型の実際の名前/値は、型を正しい列挙型にマップするために使用される constexpr 関数の背後に隠される可能性があるため、重要ではありません。次のような最終的な使用法を想像できます。
template <typename... T>
class variant
{
enum class type { T... }; // magic here
// specializations provided to map T into type (for use in case labels)
template <typename T>
static constexpr type type_enum();
type active_type() const;
/* ... */
};
typedef variant<int, float, std::string> myvar;
myvar var;
switch (var.active_type())
{
case myvar::type_enum<int>(): // static constexpr function
...
break;
case myvar::type_enum<float>():
...
break;
} // warning: enumeration for string not handled in switch