我有一个相当简单的变体类,它支持一组预定义的类型,并提供一个枚举来指示哪些可用类型当前处于活动状态。像这样的东西:
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