- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在阅读关于如何定义 set
的 C++ Primer .当我查看关于 set
的 cppreference 时,我对 set
的类和构造函数签名感到困惑.
来自正文:
bool compareIsbn(){....}
multiset<Sales_data, decltype(compareIsbn) *> bookstore(compareIsbn)
文本 1:
To use our own operation, we must define the multiset with two types: the key type,
Sales_data
, and the comparison type, which is a function pointer type that can point tocompareIsbn
. When we define objects of this type, we supply a pointer to the operation we intend to use. In this case, we supply a pointer tocompareIsbn
:
所以从 text1 看来,我需要在 set<Class A, a function pointer>
中放置一个函数指针 .
但是当我查找cppreference ,“签名”(不确定是否正确)是:
template<
class Key,
class Compare = std::less<Key>,
class Allocator = std::allocator<Key>
> class set;
问题1:所以第二个参数应该是class
?
文本 2:
We can write
compareIsbn
instead of&compareIsbn
as the constructor argument because when we use the name of a function, it is automatically converted into a pointer if needed. We could have written&compareIsbn
with the same effect.
同样来自 cppreference constructor of set (我觉得教科书上用的是第一个构造函数):
set();
explicit set( const Compare& comp,
const Allocator& alloc = Allocator() );
问题 2:构造函数不需要函数引用吗?它从哪里说它需要一个函数指针?
需要一些帮助来理解“签名”,提前致谢:D。
附言:
multiset
作为一个例子,但是 set
的“签名”和 multiset
非常相似。const Allocator& alloc = Allocator()
意思是,但我想也许这是自动完成的事情?我现在可能会忽略它。最佳答案
这有点困惑,但很接近正确。
用“类”指定的类型模板参数是一个历史/语法怪癖;这实际上表明参数是一种类型。 'typename' 也是合法的并且在语义上是相同的:
template<typename T>
struct Foo {
T thing;
}
template<class T>
struct Bar {
T thing;
}
// Foo and Bar will work identically
在本书的示例中,传递给模板的类型是“指向 CompareIsbn 类型的指针”
关于你的第二个问题,记住Compare
是一种类型:
template<typename T>
void Foo(const T& object) { ... }
模板函数 Foo 期望传递一个对 T 的 const 引用。如果 T 是一个指针类型,那么它期望一个对指针的 const 引用:
Thing* bar = new Thing();
Foo<Thing*>(bar); // This instantiation of the template has signature void (const Thing*&)
在书中的示例中,Compare
是decltype(CompareIsbn)*
, 所以你必须通过 const decltype(CompareIsbn)*&
给构造函数。
cppreference 有一个 page详细说明用于 Compare
的类型的要求set
中的参数模板,您可能会发现它很有用。简短的版本是它必须是这样的代码才能工作的类型:
// Given Compare comp
// Given Key a, b
bool b = comp(a, b);
关于如何调用 operator()
有一些要求必须守规矩。
函数指针将在该上下文中工作,所以没问题。但也是std::function
,或任何实现 operator()
的类型以正确的行为。 = std::less<Key>
模板声明中的位正在为 Compare
设置默认值参数是这样一个对象,它只是尝试使用 Key::operator<
.
Allocator
parameter 也是一个类似函数的对象,用于创建新的 Key
必要时的对象。您很少需要提供显式分配器;默认实现在几乎所有情况下都能正常工作。
关于c++ - std::set 构造函数签名混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51183688/
我得到了这个printHashKey函数,它运行良好。 fun printHashKey() { try { val info : PackageInfo = packageM
如何使用正确的签名 key 为我的 Android 应用包签名? 最佳答案 我尝试在此处和 this question 中使用多个答案, 但不知何故我收到了这个错误,因为我的 android/app/
我的 gradle 文件中有这个: android { signingConfigs { mySigningConfig { keyAlias 'the
请至少选择一个签名版本以在 Android Studio 2.3 中使用 现在在 Android Studio 中生成一个签名的 APK 时,它显示了两个选项(复选框),即 1. V1(Jar 签名)
我想表示一些标量值(例如整数或字符串)通过它的实际值或一些 NA 值,然后存储它们在集合中(例如列表)。目的是处理缺失值。 为此,我实现了一个签名 module type Scalar = sig
为什么这不完全有效? sum :: (Num a, Num b) => a -> b -> c sum a b = a + b 当然,错误消息与签名有关,但我仍然不明白原因。 Couldn't mat
谢谢帮助,我的问题是关于从下面的代码中收到的 ax 值? mov al,22h mov cl,0fdh imul cl 真机结果:ff9a 我的预期:00:9a(通过二进制相乘) 第一个数字是 22h
我有一个注释: import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.
我从对物体的思考中得出了一个术语。当我们扩展一个类时,扩展类将具有与父类相同的签名,因此术语 IS-A 来自...示例 class Foo{ } class Foo2 extends Foo{ } c
我需要在有符号整数和它们作为字节序列的内部表示之间进行转换。在 C 中,我使用的函数如下: unsigned char hibyte(unsigned short i) {return i>>8;}
我正在尝试使用给定的 RSA 参数对一些数据进行签名。 我给出了模数、指数、D、DP、DQ、P、Q 和 InverseQ。什么库或方法最容易使用来计算此签名。在 C# 中,一旦您提供参数,它们就会有一
这些签名之间有什么区别? T * f(T & identifier); T & f(T & identifier); T f(T & identifier); void f(T * identifie
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Where and why do I have to put the “template” and “typ
我有一个签名,我需要在签名旁边添加图片。但我不确定 css 的确切程度和内容。目前它显示在文字下方,我应该把图片放在哪里?在相同的 tr 或 td 中?
查看 LinkedHashMap 的 JDK 源代码,我注意到这个类被声明为: public class LinkedHashMap extends HashMap im
背景:我继承了一个基于 linux 的嵌入式系统,其中包含一个 SMTP 代理和一些我不得不忍受的古怪限制。它位于 SMTP 客户端和服务器之间。当 SMTP 客户端连接时,代理会打开与服务器的连接,
这是 C++17 形式的规则 ([basic.lval]/8),但它在其他标准中看起来很相似(在 C++98 中是“lvalue”而不是“glvalue”): 8 If a program attem
我有一个注释: import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.
我即将开展一个项目,希望使用电子签名板使用 C# 捕获客户的签名、在设备上显示文本等。 现在,在我开始做进一步的研究之前,我想向你们征求一些意见/建议,我应该使用哪些设备.. 我现在的要求非常笼统:我
呢喃自己在心中开始扩张地盘,仿佛制式地广播了三次。 漾起的涟绮,用谈不上精腻的手段。 拒绝天亮,却又贪恋着贪恋多情的日光。 川流不息的画面是他们,而我的落幕停在右脚,它渴望着下台,而我只剩自言
我是一名优秀的程序员,十分优秀!