通用模板化枚举空值

时间:2014-01-09 11:46:55

标签: c++ templates enums warnings clang

clang ++ 抱怨变量未初始化:

template<typename TEnum> void func() {
    TEnum enumVar; 
    // ...
    if(something()) enumVar = someValue();
    // ...
    if(something()) doSomethingWith(enumVar); // <- clang++ tells me 
                                              // enumVar may be uninitialized
}

通常,要避免此警告,枚举可能会有Unknown = -1值或类似的值 - 但不幸的是,枚举类型由用户传递为typename TEnum,所以我不知道是否它包含一个“空值”。

有什么方法可以解决这个问题吗?或者我应该忽略/禁止警告?

4 个答案:

答案 0 :(得分:3)

只需始终初始化,例如使用三元运算符,然后继续处理它:

template<typename TEnum> 
void func() 
{
    TEnum enumVar = something() ?  someValue() : otherValue();
    if (something()) 
        doSomethingWith(enumVar); 
}

显然,如果something()价格昂贵,你可以缓存它等等,但重点仍然是:从处理中单独初始化。

答案 1 :(得分:2)

您可以初始化枚举:

template<typename TEnum> void func() {
    TEnum enumVar = TEnum();
    // TEnum enumVar {}; // C++11 way

    // ...
    if(something()) enumVar = someValue();
    // ...
    if(something()) doSomethingWith(enumVar);
}

请注意,枚举的值为0,可能是无效值。

答案 2 :(得分:0)

boost::optional<E>采用几乎常规的类型,并通过将未初始化定义为空来对其进行正规化。如果为空则使用UB,除了检查它是否为空或similsr操作。

答案 3 :(得分:0)

您可以在功能模板中再添加一个模板参数:

template<typename TEnum, TEnum nullValue> void func() {
    TEnum enumVar = nullValue;
    // ...
}

在C ++ 11中,您还可以使用默认模板参数:

template<typename TEnum, TEnum nullValue = Enum()> void func() {
    TEnum enumVar = nullValue;
    // ...
}