测试 c++ 之 is_function_v

文章介绍了C++17中的std::is_function_v,这是一种类型特质,用于判断给定类型是否为函数类型,包括函数指针和非const引用。示例展示了不同类型的函数检查结果。

在这里插入图片描述
如图,给 is_function_v 传入一个类,为假,传入一个函数对象则为真 。
(2)以下是文心一言的解释,真好:
在 C++ 中,std::is_function_v 是一个类型特征(type trait),用于检查给定的类型是否为函数类型。它是 C++17 中引入的一个模板元函数,返回一个布尔值,表示给定的类型是否为函数类型。

以下是使用 std::is_function_v 的示例:

#include <iostream>  
#include <type_traits>  
  
 template <class _Ty> // only function types and reference types can't be const qualified
constexpr bool is_function_v = !is_const_v<const _Ty> && !is_reference_v<_Ty>; 
  
int main() {  
    std::cout << std::boolalpha;  
    std::cout << "Is int a function type? " << std::is_function_v<int> << std::endl;  
    std::cout << "Is void(*)() a function type? " << std::is_function_v<void(*)()> << std::endl;  
    std::cout << "Is void(*)(int) a function type? " << std::is_function_v<void(*)(int)> << std::endl;  
    std::cout << "Is void(*)() const a function type? " << std::is_function_v<void(*)() const> << std::endl;  
    std::cout << "Is void(*)() & a function type? " << std::is_function_v<void(*)() &> << std::endl;  
    std::cout << "Is void(*)() && a function type? " << std::is_function_v<void(*)() &&> << std::endl;  
    return 0;  
}

测试结果如下:
Is int a function type? false
Is void()() a function type? true
Is void(
)(int) a function type? true
Is void()() const a function type? true
Is void(
)() & a function type? true
Is void(*)() && a function type? true

其实在vs2019上的测试结果不一致。再附上一图:
在这里插入图片描述

### sequenced_policy 的用途 `std::execution::sequenced_policy` 是 C++17 标准中引入的执行策略之一,定义在头文件 `<execution>` 中,用于指示并行算法在单线程上按顺序执行。其主要用途是确保算法在调用时不会产生任何并行化行为,即所有操作都将在调用线程上依次执行。这种策略适用于需要避免并行化开销或确保操作顺序的场景,例如调试、测试或对数据依赖性要求较高的算法。 在使用支持执行策略的算法时,可以通过传递 `std::execution::sequenced_policy` 对象来显式选择顺序执行模式。例如,在 `std::for_each` 或 `std::transform` 等算法中,可以通过此策略确保操作按顺序执行且不会引入并行化副作用 [^2]。 ### sequenced_policy 的实现 `sequenced_policy` 的实现主要依赖于标准库对执行策略的支持。它是一个空的标记类型,用于在算法内部进行策略选择。标准库算法通过重载或模板特化来区分不同的执行策略,并根据策略选择相应的执行方式。 以下是一个简化的示例,展示如何模拟 `sequenced_policy` 的行为: ```cpp #include <iostream> #include <vector> #include <execution> // 自定义 sequenced_policy 类型 struct sequenced_policy {}; // 自定义并行策略类型(示例) struct parallel_policy {}; // 自定义算法实现 template<typename Policy, typename Iterator, typename Function> void for_each(Policy policy, Iterator first, Iterator last, Function func) { // 根据策略选择执行方式 if constexpr (std::is_same_v<Policy, sequenced_policy>) { // 按顺序执行 while (first != last) { func(*first); ++first; } } else if constexpr (std::is_same_v<Policy, parallel_policy>) { // 并行执行(示例中简化为顺序执行) while (first != last) { func(*first); ++first; } } } int main() { std::vector<int> data = {1, 2, 3, 4, 5}; // 使用自定义 sequenced_policy 调用 for_each for_each(sequenced_policy{}, data.begin(), data.end(), [](int& value) { std::cout << value << " "; }); return 0; } ``` 在上述示例中,`sequenced_policy` 被模拟为一个简单的标记类型,并在 `for_each` 函数中通过 `if constexpr` 条件判断来选择顺序执行逻辑。实际标准库实现会更加复杂,涉及底层调度机制和优化 [^1]。 ### sequenced_policy 的适用场景 - **调试和测试**:确保算法行为与顺序执行一致,便于调试和验证逻辑。 - **避免并行化开销**:在数据量较小或并行化代价较高的场景中,选择顺序执行以提升性能。 - **数据依赖性**:当算法逻辑中存在严格的数据依赖关系时,防止并行化导致的不一致或竞态条件 [^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangzhangkeji

谢谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值