std::设置构造函数签名混淆
std::set constructor signature confusion
我正在阅读C++入门,了解如何定义set
。当我浏览cpp偏好关于set
时,我对set
的类和构造函数签名感到困惑。
从文本:
bool compareIsbn(){....}
multiset<Sales_data, decltype(compareIsbn) *> bookstore(compareIsbn)
文本 1:
要使用我们自己的操作,我们必须用两种类型定义多集: 键类型
Sales_data
和比较类型(函数( 可以指向compareIsbn
的指针类型。 当我们定义对象时 在此类型中,我们提供一个指向我们打算使用的操作的指针。在 在这种情况下,我们提供了一个指向compareIsbn
的指针:
所以从text1来看,我似乎需要在set<Class A, a function pointer>
中放置一个函数指针。
但是当我查找 cpp首选项时,"签名"(不确定它是否是正确的词(是:
template<
class Key,
class Compare = std::less<Key>,
class Allocator = std::allocator<Key>
> class set;
问题1:所以第二个参数应该是class
?
文本 2:
我们可以编写
compareIsbn
而不是&compareIsbn
作为构造函数 参数,因为当我们使用函数的名称时,它是 如果需要,自动转换为指针。我们可以有 具有相同效果的书面&compareIsbn
。
同样来自集合的cppreference构造函数(我认为教科书使用的是第一个构造函数(:
set();
explicit set( const Compare& comp,
const Allocator& alloc = Allocator() );
问题 2:构造函数不需要函数引用吗?从哪里说它需要一个函数指针?
需要一些帮助来理解"签名",提前感谢:D。
附注:
- 教科书以
multiset
为例,但set
和multiset
的"签名"却大同小异。 - 我不知道
const Allocator& alloc = Allocator()
是什么意思,但我想也许这是自动完成的事情?我暂时可以忽略它。
这有点混乱,但相当接近正确。
使用"class"指定的类型模板参数是一个历史/语法怪癖;这实际上表明该参数是一种类型。"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 的常量引用。如果 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)*&
传递给构造函数。
CPP首选项有一个页面,详细说明了用于set
模板中Compare
参数的类型的要求,您可能会发现该页面很有用。简短的版本是,它只需要是一种类型,以便此代码正常工作:
// Given Compare comp
// Given Key a, b
bool b = comp(a, b);
然后,对于调用operator()
必须如何行为,有一些要求。
函数指针将在该上下文中工作,因此没问题。但std::function
,或任何以正确行为实施operator()
的类型也是如此。模板声明中的= std::less<Key>
位是将Compare
参数的默认值设置为此类对象,该对象只是尝试使用Key::operator<
。
Allocator
参数也是一个类似函数的对象,用于在必要时创建新的Key
对象。您很少需要提供显式分配器;默认实现在几乎所有情况下都可以正常工作。
从text1来看,我似乎需要将函数指针放在
set<Class A, a function pointer>
差一点。是的,您需要提供指向构造函数的函数指针,但文本告诉您需要提供一个类型作为模板的参数。所述类型必须是函数指针的类型。
所以第二个参数应该是一个类吗?
第二个参数必须是类型。模板类型参数由两个关键字之一指定,class
或typename
。但它们的意思是一样的,你提供的参数必须是一个类型。
构造函数不需要函数引用吗?
不,它需要引用您作为参数给出的类型的对象。由于您提供函数指针作为类型,因此它需要对函数指针的引用。这就是它最终得到的。
- 如何在构造函数中使用初始值设定项设置具有相同值的 2d 数组?
- 构造函数将所有值设置为 0
- 如何在没有复制构造函数的情况下为地图设置值?
- 类中的 Arduino 对象构造函数设置垃圾值
- 为什么我的突变器函数没有设置任何内容?还是我的构造函数?
- 无法在构造函数中执行设置元素插入
- 在 c++ 中将对象设置为等于同一类的构造函数是否有效?
- 使用构造函数初始化结构还是在之后设置其值更好?
- 将复制构造函数设置为private和=delete有什么区别
- 我可以检查初始化列表中设置的构造函数主体中的变量吗
- 将复制构造函数设置为默认值在继承自 QObject 时不起作用
- 尝试将构造函数设置为 0 - c++ 的未处理异常
- C++构造函数设置值
- 多个线程 - 无法访问构造函数设置的类成员变量
- 什么时候应该将构造函数设置为 constexpr
- 在类中声明数组,并使用构造函数设置其大小
- 无法从构造函数设置私有值
- 我的第一个大小工作,但无法为我的其他构造函数设置大小
- 是否可以将默认构造函数设置为"std::map<T1,T2>"值?
- 在类构造函数中设置std::vector,为元素构造函数设置不同的值