std::is_same 否则静态断言

std::is_same else static assert

我喜欢根据模板类型专门化一个函数。这适用于 std::is_same.

现在,如果给出的不是专门的类型,我希望代码不编译。

template <typename T>
constexpr double get(const T& item) const {
    if (std::is_same<T, SOME_TYPE>::value)
        return item.get();
    if (std::is_same<T, SOME_OTHER_TYPE>::value)
        return -1.0;
    else {
        // Compile time error, if this branch is created.
        static_assert(false, "Getter not implemented for Type");
        return -1.0;
    }
}

此代码段无法编译,并显示错误消息

error: static assertion failed with "Getter not implemented for Type"

虽然函数只用SOME_TYPESOME_OTHER_TYPE实例化。

我如何确保在编译时不使用除 SOME_TYPESOME_OTHER_TYPE 之外的其他类型?

最简单的方法是做这样的事情:

template <typename T>
constexpr double get(const T& item) const {
    static_assert(
        std::is_same<T, SOME_TYPE>::value || std::is_same<T, SOME_OTHER_TYPE>::value,
        "Getter not implemented for Type");
    if constexpr (std::is_same<T, SOME_TYPE>::value) {
        return item.get();
    } else if constexpr (std::is_same<T, SOME_OTHER_TYPE>::value) {
        return -1.0;
    }
}

请注意,您的编译器需要支持 C++17,因此您可以将 if 替换为 if constexpr

编辑:如果SOME_OTHER_TYPE没有get()成员方法,这里需要constexpr if以避免编译错误。因此我更改了代码

如果提供的代码是您想要的(即每个块彼此独立),只需使用重载函数。

constexpr double get(const SOME_TYPE& item){
   return item.get();
}
constexpr double get(const SOME_OTHER_TYPE&){
    return -1;
}