根据https://en.cppreference.com/w/cpp/algorithm/execution_policy_tag,命名空间std::execution
定义了各个类型的编译时常量:
inline constexpr std::execution::sequenced_policy seq { /* unspecified */ };
inline constexpr std::execution::parallel_policy par { /* unspecified */ };
inline constexpr std::execution::parallel_unsequenced_policy par_unseq { /* unspecified */ };
inline constexpr std::execution::unsequenced_policy unseq { /* unspecified */ };
这些值用于参数化其他函数以使用不同的模式。
另一种实现方式可能如下所示:
enum class policy {
seq,
par,
par_unseq,
unseq,
};
我可能会看到前者比后者有两个好处,但两者都不成立:
1.您可以基于此参数定义函数的各个重载;然而,实际上并不是这样:std::for_each
具有template<typename ExecutionPolicy, ...>
1.它是可扩展的:枚举不能由用户扩展,但是用户总是可以定义他们自己的结构,并且这通常在整个标准库中是允许的,例如通过模板专门化;然而,这在这里并不适用,因为标准库未指定实现细节;因此,不可能创建您自己符合标准的类型
标准库方法的主要缺点是,它将使用的函数转换为模板,从而使所有内容都内联,编译速度更慢,等等。
当一个枚举也能做同样的工作时,使用单独的类型而不是枚举的理由是什么?在标准库中有预定义枚举的例子吗?
在编写自己的库时,我应该模仿这种约定还是尽可能选择枚举?
1条答案
按热度按时间hgqdbh6s1#
无论如何,标准库算法都是模板,因此在这方面不存在任何潜在的差异。
对所有共享相同类型的策略使用枚举方法的唯一好处是,可以在运行时轻松地选择策略。但是,策略的选择必须与所使用的类型/算法相协调。这不太可能有用。
在其他条件相同的情况下,最好对每个策略使用不同的类型,以便在编译时有更多的信息可用。如果需要,在实现中总是可以丢弃编译时信息,但反之则不可能。
关于你的观点:
1.仅仅因为标准只指定了一个重载并不意味着实现必须只使用一个重载。标准库实现可以使用任意多个重载。
1.无论如何都不允许专用化或重载标准库函数。