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
可以工作,也许?