gpt4 book ai didi

c++ - 指向 deque::push_back 的指针

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:39:47 26 4
gpt4 key购买 nike

#include <iostream>
#include <deque>

using namespace std;
main()
{
typedef void (deque<int>::*func_ptr)(int);
func_ptr fptr = &deque<int>::push_back;
}

我试图获取指向该函数的指针,但出现编译错误

error: cannot convert ‘void (std::deque<int>::*)(const value_type&) {aka void (std::deque<int>::*)(const int&)}’ to ‘func_ptr {aka void (std::deque<int>::*)(int)}’ in initialization
func_ptr fptr = &deque<int>::push_back;

我想这样做是为了根据不同的条件得到指向不同成员函数的指针。

我提到了 this link .

最佳答案

如已接受的答案所述,问题在于类型签名不同——对于 std::deque<T> , push_back只有一个接受 T const& 的重载,而不是 T直接地。 typedef void (deque<int>::*func_ptr)(const int &)是一个非常简洁和 cromulent 的方式来写这个。

我想解决一个 C++11 的方法来做到这一点——类型别名。人们可能首先想知道“为什么不使用 auto ?”这是不可能的,因为被访问的函数是一个重载函数,并且 auto不知道要访问哪个重载。因为原始问题嵌入了函数类型的知识 void(int) , 声明 &deque<int>::push_back选择正确的过载。更简单语句的问题在于它包含了容器和所包含类型的知识。如果你想换成std::vector , 或来自 intshort ,你必须制作所有新类型。使用类型别名,我们可以将所有内容模板化以避免嵌入类型知识:

using func_ptr = void(Cont::*)(typename Cont::const_reference);

我们可以像以前一样做一些简单的事情:

func_ptr<deque<int>> fptr = &deque<int>::push_back;

...或者我们可以在某处引用容器:

vector<short> container;

...在编译时查找其类型,并存储指向其 push_back 的指针函数,完全不关心容器是什么:

using container_type = decltype(container);
func_ptr<container_type> fptr2 = &container_type::push_back;

关于c++ - 指向 deque<int>::push_back 的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40996707/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com