C++ std::与其他静态断言相同吗

C++ std::与其他静态断言相同吗,c++,templates,static-assert,is-same,C++,Templates,Static Assert,Is Same,我喜欢针对模板类型专门化函数。这适用于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&

我喜欢针对模板类型专门化函数。这适用于
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;
    }
}
模板
constexpr双获取(const T和item)const{
if(std::is_same::value)
return item.get();
if(std::is_same::value)
回报率-1.0;
否则{
//如果创建了此分支,则为编译时错误。
静态_断言(false,“未为类型实现Getter”);
回报率-1.0;
}
}
此代码段未编译,并显示错误消息

错误:静态断言失败,出现“Getter未为类型实现”

尽管该函数仅用
某些类型
某些其他类型
实例化


如何确保在编译时不会使用除
SOME\u TYPE
SOME\u OTHER\u 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;
    }
}
模板
constexpr双获取(const T和item)const{
静态断言(
std::is_same::value | std::is_same::value,
“未为类型实现Getter”);
如果constexpr(std::is_same::value){
return item.get();
}否则如果constexpr(std::is_same::value){
回报率-1.0;
}
}
请注意,您的编译器需要支持C++17,以便可以将
if
替换为
if constexpr


编辑:如果
某些其他类型的
没有
get()
成员方法,则此处需要
constepr if
,以避免编译错误。因此,我更改了代码

最简单的方法是这样做:

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;
    }
}
模板
constexpr双获取(const T和item)const{
静态断言(
std::is_same::value | std::is_same::value,
“未为类型实现Getter”);
如果constexpr(std::is_same::value){
return item.get();
}否则如果constexpr(std::is_same::value){
回报率-1.0;
}
}
请注意,您的编译器需要支持C++17,以便可以将
if
替换为
if constexpr


编辑:如果
某些其他类型的
没有
get()
成员方法,则此处需要
constepr if
,以避免编译错误。因此,我更改了代码

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

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

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

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

use constepr如果在编译时选中了
static\u assert
,而
if
-
else
处于运行时,则仍需要编译
else
块,这就是断言失败的时候。如果constexpr
可以工作,那么可能
会工作吗?如果编译时选中了
静态断言
如果运行时选中了
-
其他
,那么仍然需要编译
其他
块,这就是断言失败的时候。如果constexpr
可以工作,也许