- 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/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!