提问者:小点点

如何比较ConstExpr中的类型?


有没有一种方法可以更好地比较第一最后的if?例如,如果我希望floatdouble有不同的行为。有没有一种方法可以使用constexpr内部的实际类型(而不是它在内存中的大小)进行比较?下面是我的代码:

void print(T val)
{
    if constexpr (sizeof(T) == 1) {
        printf("%c", val);
    }
    else if constexpr (std::is_integral_v<T>) {
        printf("%d", val);
    }
    else if constexpr (sizeof(T) == sizeof(float)) {
        printf("%f", val);
    }
    printf("\n");
}

int main(int argc, char** argv)
{
    print(5.5f);
    return 0;
}

共1个答案

匿名用户

是的!

您正在查找std::is_same_v:

void print(T val)
{
    if constexpr (std::is_same_v<T, char>) {
        printf("%c", val);
    }
    else if constexpr (std::is_integral_v<T>) {
        printf("%d", val);
    }
    else if constexpr (std::is_same_v<T, float>) {
        printf("%f", val);
    }
    printf("\n");
}

int main(int argc, char** argv)
{
    print(5.5f);
    return 0;
}

注意:。第一个条件与您的条件不太相同(例如无符号char有符号charstd::byte…),但是您可以根据需要进行修改。

另外,%d用于int(在将晋升应用于val之后);您的is_integral_v检查不足以保证这一点。