基于模板参数将函数标记为 noexcept
Mark function as noexcept based on template argument
取此代码:
template <class T>
void my_func() { T::some_method(); }
int main() {
std::cout << (noexcept(my_func<SomeClass>()) ? "noexcept" : "can throw") << std::endl;
return 0;
}
这将始终打印出 my_func()
可以抛出,即使 SomeClass::some_method()
被标记为 noexcept。 (至少对于 gcc 7.4.0 和 -std=c++17)
有没有一种实用的方法可以让编译器根据模板参数检测函数是否为 noexcept
?
我唯一能想到的就是使用 std::enable_if :
template <class T>
std::enable_if_t<true == noexcept(T::some_method())>
my_func() noexcept { T::some_method(); }
template <class T>
std::enable_if_t<false == noexcept(T::some_method())>
my_func() { T::some_method(); }
但是需要很多space并且导致代码重复。
noexcept
规范有一个采用布尔值的版本。
template <class T>
void my_func() noexcept(noexcept(T::some_method())) { T::some_method(); }
现在它将有条件地 noexcept,基于表达式 T::some_method()
.
取此代码:
template <class T>
void my_func() { T::some_method(); }
int main() {
std::cout << (noexcept(my_func<SomeClass>()) ? "noexcept" : "can throw") << std::endl;
return 0;
}
这将始终打印出 my_func()
可以抛出,即使 SomeClass::some_method()
被标记为 noexcept。 (至少对于 gcc 7.4.0 和 -std=c++17)
有没有一种实用的方法可以让编译器根据模板参数检测函数是否为 noexcept
?
我唯一能想到的就是使用 std::enable_if :
template <class T>
std::enable_if_t<true == noexcept(T::some_method())>
my_func() noexcept { T::some_method(); }
template <class T>
std::enable_if_t<false == noexcept(T::some_method())>
my_func() { T::some_method(); }
但是需要很多space并且导致代码重复。
noexcept
规范有一个采用布尔值的版本。
template <class T>
void my_func() noexcept(noexcept(T::some_method())) { T::some_method(); }
现在它将有条件地 noexcept,基于表达式 T::some_method()
.