如何检测模板参数是否为noexcept函数
How can I detect whether a template argument is a noexcept function?
我有一个函数来生成一个lambda,它充当我稍后可以调用的函数的包装器:
template <typename F, typename... FArgs>
auto make_lambda( F&& f, FArgs&&... f_args )
{
return [&] () -> std::result_of_t<F( FArgs... )>
{
return std::forward<F>( f )( std::forward<FArgs>( f_args )... );
};
}
当参数f
是noexcept
时,我想使返回的lambda noexcept
,所以我的函数的返回如下所示:
return [&] () noexcept( is_noexcept<decltype( f )>::value )
-> std::result_of_t<F( FArgs... )>
{
return std::forward<F>( f )( std::forward<FArgs>( f_args )... );
};
我的尝试:
#include <type_traits>
void f() {}
void g() noexcept {}
template <typename F, typename... Args>
struct is_noexcept : std::false_type {};
template <typename F, typename... Args>
struct is_noexcept<F( Args... ) noexcept> : std::true_type {};
int main()
{
bool constexpr func_test_a{ is_noexcept<decltype( f )>::value }; // true
bool constexpr func_test_b{ is_noexcept<decltype( g )>::value }; // true
}
但是,测试总是返回true
。我错过了什么?有人能为这个问题提供解决方案吗?
来源:http://en.cppreference.com/w/cpp/language/noexcept_spec
noexcept规范不是函数类型的一部分。(直到C++17)。
目前,模板推导不会产生正确的结果,因为noexcept
说明符不是函数类型的一部分;模板类型推导要到C++17才能工作。我检测函数是否为noexcept
的方法在C++17中是有效的,这个答案的方法也是有效的。
您可以使用noexcept
运算符,该运算符接受一个表达式并在该表达式为noexcept
时生成true
。
未测试,但这可能适用于您的用例。
return [&] () noexcept(noexcept(std::forward<F>( f )( std::forward<FArgs>( f_args )... )))
-> std::result_of_t<F( FArgs... )>
{
return std::forward<F>( f )( std::forward<FArgs>( f_args )... );
};
相关文章:
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- 是否可以对零模板参数进行模板专门化
- 函数作为模板参数,是否对返回类型强制约束
- visual是否可以在c++中创建一个接收无限数量相同类型(或至少相当数量)参数的函数
- 函数是否可以访问传递给main()的参数
- 在C++中,使用带有 std::optional 参数的函数<T>来表示可选参数是否有意义?
- 如何检查给定的参数是否为 cv::noArray()?
- 表达式 SFINAE:如何根据类型是否包含具有一个或多个参数的函数来选择模板版本
- 如果返回 -1,时间() 的参数是否被修改?
- 用于检查值是否为其任何参数的帮助程序函数
- 将类型声明为类型模板参数的模板参数的一部分是否合法?
- 模板化检查是否存在带有参数列表的类成员函数?
- 我如何知道作为参数的size_t在函数中是否有效?
- 是否可以在C++中有一个"generic"模板参数,该参数可以是非类型模板参数或类型?
- 是否可以就地构造一个固定大小的数组作为函数参数?
- C++方法是否可以根据传递给构造函数的参数具有不同的返回类型?
- 是否可以在运行时强制转换模板参数?
- 是否可以在不填充自己的参数的情况下将模板函数作为参数传递?
- 编译器是否强制根据模板参数计算表达式?
- C++中大多数/所有 setter 函数的参数是否应该写为常量引用?