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_TYPE
或SOME_OTHER_TYPE
实例化。
我如何确保在编译时不使用除 SOME_TYPE
或 SOME_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;
}
我喜欢根据模板类型专门化一个函数。这适用于 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_TYPE
或SOME_OTHER_TYPE
实例化。
我如何确保在编译时不使用除 SOME_TYPE
或 SOME_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;
}