- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在概念演示中,显示了这样的内容:
template <bidirectional_iterator It>
void sort(It begin, It end); // #1
template <random_access_iterator It>
void sort(It begin, It end); // #2
std::list<int> l{};
sort(l.begin(), l.end()); // #A -> calls #1
std::vector<int> v{};
sort(v.begin(), v.end()); // #B -> calls #2
对于调用 #A
很简单:只有 sort #1
可行,因为约束 random_access_iterator
不满足,所以它调用 #1
。
但对于 #B
调用,两个 sort
都是可行的,因为两个约束(random_access_iterator
和 bidirectional_iterator
是使满意)。那么“更高效”的 sort #2
是如何选择的呢?主持人说“它只是有效”。
最佳答案
So how is the "more efficient"
sort #2
chosen?
之所以可行,是因为约束条件存在部分排序(由包含 关系定义)。
sort #2
(带有 randomaccess_iterator
的)比 sort #1
更受限制 (带有 bidirectional_iterator
的那个)因为 randomaccess_iterator
包含 bidirectional_iterator
:
template <class It>
concept bidirectional_iterator = requires /*...*/;
template <class It>
concept randomaccess_iterator = bidirectional_iterator<It> && requires /*...*/;
为了使这项工作约束在连接和分离的语言级别上是可感知的。
确定一个声明是否比另一个声明受到更多或更少约束的过程是这样的:约束规范化 -> 约束 subsumes 关系 ->(定义)约束偏序 ->(确定)声明是多/少约束关系。
简而言之,归一化是约束参数映射中概念模板参数的替代。
例子:
template <class T> concept integral = std::is_integral_v<T>;
template <class T> concept signed_integral = integral<T> && std::is_signed_v<T>;
template <class T> concept integral_4 = integral<T> && sizeof(T) == 4;
void foo_1(integral auto) // #0
void foo_1(signed_integral auto) // #1
void foo_1(integral_4 auto) // #2
auto test1()
{
foo_1(std::uint16_t{}); // calls #0
foo_1(std::uint32_t{}); // calls #2
foo_1(std::int16_t{}); // calls #1
//foo_1(std::int32_t{}); // error ambiguous between #1 and #2
}
integral
的范式是std::is_integral_v<T>
signed_integral
的范式是std::is_integral_v<T> ∧ std::is_signed_v<T>
范式 integral_4
是std::is_integral_v<T> ∧ sizeof(T) == 4
signed_integral
包含 integral
integral_4
包含 integral
#1
比 #0
更具约束力
#2
比 #0
更具约束力例子:
template <class T> concept integral = std::is_integral_v<T>;
template <class T> concept signed_integral_sad = std::is_integral_v<T> &&
std::is_signed_v<T>;
template <class T> concept integral_4_sad = std::is_integral_v<T> && sizeof(T) == 4;
void foo_2(integral auto) // #0
void foo_2(signed_integral_sad auto); // #1
void foo_2(integral_4_sad auto); // #2
auto test2()
{
foo_2(std::uint16_t{}); // calls #0
//foo_2(std::uint32_t{}); // error ambiguous between #0 and #2
//foo_2(std::int16_t{}); // error ambiguous between #0 and #1
//foo_2(std::int32_t{}); // error ambiguous between #0, #1 and #2
}
integral
的范式是std::is_integral_v<T>
signed_integral_sad
的范式是std::is_integral_v<T> ∧ std::is_signed_v<T>
integral_4_sad
是std::is_integral_v<T> ∧ sizeof(T) == 4
但是有一个规则
§13.5.1.2 Atomic constraints [temp.constr.atomic]
- Two atomic constraints,
e1
ande2
, are identical if they are formed from the same appearance of the same expression [...]
这意味着 std::is_integral_v<T>
来自 3 种范式的原子表达式在它们之间并不相同,因为它们不是由相同的表达式形成的。所以:
这会导致额外的歧义。
§ 13.5.1 Constraints [temp.constr.constr]
A constraint is a sequence of logical operations and operands that specifies requirements on template arguments. The operands of a logical operation are constraints. There are three different kinds of constraints:
- (1.1) conjunctions (13.5.1.1)
- (1.2) disjunctions (13.5.1.1), and
- (1.3) atomic constraints (13.5.1.2).
§13.5.1.1 Logical operations [temp.constr.op]
- There are two binary logical operations on constraints: conjunction and disjunction. [Note: These logical operations have no corresponding C++ syntax. For the purpose of exposition, conjunction is spelled using the symbol ∧ and disjunction is spelled using the symbol ∨]
§13.5.3 Constraint normalization [temp.constr.normal]
The normal form of an expression E is a constraint (13.5.1) that is defined as follows:
- (1.1) The normal form of an expression
( E )
is the normal form ofE
.- (1.2) The normal form of an expression
E1 || E2
is the disjunction (13.5.1.1) of the normal forms ofE1
andE2
.- (1.3) The normal form of an expression
E1 && E2
is the conjunction of the normal forms ofE1
andE2
.- (1.4) The normal form of a concept-id
C<A1, A2, ..., An>
is the normal form of the constraint-expression ofC
, after substitutingA1, A2, ..., An
forC
’s respective template parameters in the parameter mappings in each atomic constraint. [...]- (1.5) The normal form of any other expression
E
is the atomic constraint whose expression isE
and whose parameter mapping is the identity mapping.The process of obtaining the normal form of a constraint-expression is called normalization.
§13.5.4 Partial ordering by constraints [temp.constr.order]
A constraint
P
subsumes a constraintQ
if and only if, for every disjunctive clausePi
in the disjunctive normal form 130 ofP
,Pi
subsumes every conjunctive clauseQj
in the conjunctive normal form 131 ofQ
, where
- (1.1) a disjunctive clause
Pi
subsumes a conjunctive clauseQj
if and only if there exists an atomic constraintPia
inPi
for which there exists an atomic constraintQjb
inQj
such thatPia
subsumesQjb
, and- (1.2) an atomic constraint
A
subsumes another atomic constraintB
if and only ifA
andB
are identical using the rules described in 13.5.1.2.[Example: Let
A
andB
be atomic constraints (13.5.1.2). The constraintA ∧ B
subsumesA
, butA
does not subsumeA ∧ B
. The constraintA
subsumesA ∨ B
, butA ∨ B
does not subsumeA
. Also note that every constraint subsumes itself. — end example][Note: The subsumption relation defines a partial ordering on constraints. This partial ordering is used to determine
- (2.1) the best viable candidate of non-template functions (12.4.3),
- (2.2) the address of a non-template function (12.5),
- (2.3) the matching of template template arguments (13.4.3),
- (2.4) the partial ordering of class template specializations (13.7.5.2), and
- (2.5) the partial ordering of function templates (13.7.6.2).
— end note]
A declaration
D1
is at least as constrained as a declarationD2
if
- (3.1)
D1
andD2
are both constrained declarations andD1
’s associated constraints subsume those ofD2
; or- (3.2)
D2
has no associated constraints.A declaration
D1
is more constrained than another declarationD2
whenD1
is at least as constrained asD2
, andD2
is not at least as constrained asD1
.
130) A constraint is in disjunctive normal form when it is a disjunction of clauses where each clause is a conjunction of atomic constraints. [Example: For atomic constraints
A
,B
, andC
, the disjunctive normal form of the constraintA ∧ (B ∨ C)
is(A ∧ B) ∨
. Its disjunctive clauses are
(A ∧ C)(A ∧ B)
and(A ∧ C)
. — end example]131) A constraint is in conjunctive normal form when it is a conjunction of clauses where each clause is a disjunction of atomic constraints. [Example: For atomic constraints
A
,B
, andC
, the constraintA ∧ (B ∨ C)
is in conjunctive normal form. Its conjunctive clauses areA
and(B ∨ C)
. — end example
关于c++ - 最好的约束函数模板是如何用概念选出来的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61634127/
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。 10年前关闭。 Improve this qu
我正在开发一个 Android 应用程序。在此应用程序中, Logo 栏显示在所有页面( Activity )上,或者我们可以说它在所有页面上都有标题。这个 Logo 栏有几个图标,如主页、登录、通知
我正在使用 hadoop 使用开源接口(interface) HVPI 处理视频。然而,inputsplit 的实现,更准确地说是在 isSplitableobContext (context, Pa
1. 是什么? MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System
有没有办法使用 c++20s 的概念来检查一个值是否满足某些要求? 假设我正在编写某种使用分页的容器,并且我想让页面大小成为模板参数。 template class container; 我可以使用带
如何在 ArrayList 中循环遍历 ArrayList? 例如,如果我有一个名为 Plants of Plant 对象的 ArrayList。每个 Plant 对象内部都有一个随机数量的花名。我如
如何在UML类图中绘制C++概念? 具体来说,我有以下代码: template concept Printable = requires(T a, std::ostream &where) {
我有兴趣制作一个网站,在访问者访问时闪现整个网络历史记录。我计划使用 JavaScript 来获取每个观看者计算机上的历史记录,并根据他们拥有的内容以不同的速度对其进行动画处理。我的想法是使用 his
有一个模板定义,例如: template void foo( void ) { /* ... */ } 如何定义一个概念,以便N必须为非零正值(N> = 1)? 就像是: template con
封装是信息隐藏还是导致信息隐藏? 正如我们所说,封装将数据和函数绑定(bind)在单个实体中,因此它为我们提供了对数据流的控制,并且我们只能通过一些定义良好的函数来访问实体的数据。因此,当我们说封装导
下面有一个简单的代码片段,它使用以下方式进行编译: g++-9 -std=c++2a -fconcepts 这是试图定义一个需要存在函数的概念。我希望输出是"is",但事实并非如此……知道为什么吗?谢
我有一个普通二元运算符的概念 template concept is_binary_operation = requires (const T& t1, const T& t2) // e.g
我正在c++ 20中实现具有启发式功能的搜索算法。 我试图用类似这样的概念来约束我的算法可以使用的功能: template concept Heuristic = requires(SelfType
我需要了解 SAS 如何读取/执行数据步骤。当我查找有关 SAS 如何读取数据步骤的信息时,我似乎只找到有关它如何读取以进行合并的信息,我不了解与常规数据步骤相关的信息。比方说,我有这行代码: dat
最近我看到一个关于“框架”的问题,如果“框架”有不同的类型或概念。那么,存在不同“类型”的“框架”吗? 例如:NodeJS 是一种“类型”(概念),而 Hibernate ORM 是另一种“类型”(概
如何使用任何技术禁用或清除客户端浏览器 Cookie 我认为使用 javascript 可以用于任何技术 最佳答案 var cookies = document.cookie.split(";");
我正在使用 target = "_blank" 单击链接时生成新选项卡。但是,浏览器会将焦点移至该选项卡。 有没有办法让焦点保持在当前标签页上? 回答摘要 基本上,只需发送一个模拟控件点击的当前事件。
我正在尝试在我的 android/firebase(cloud firestore) 应用程序上添加一项需要其他用户批准/拒绝的功能。例如,当 Air&BnB 上的用户想要预订一个地方时,所有者必须批
这个问题在这里已经有了答案: mysql_fetch_array()/mysql_fetch_assoc()/mysql_fetch_row()/mysql_num_rows etc... expec
public class MyClass { public static void main(String[] args) { System.out.println("Hell
我是一名优秀的程序员,十分优秀!