指向deque <int> :: push_back的指针

时间:2016-12-06 13:36:03

标签: c++ pointers function-pointers

#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

3 个答案:

答案 0 :(得分:3)

如接受的答案所述,问题是类型签名不同 - 对于std::deque<T>push_back只有一个接受T const&的重载,而不是{{ 1}}直接。 T是一种非常简洁易懂的写作方式。

我想用C ++ 11方式来解决这个问题 - 键入别名。人们可能会首先想知道“为什么不使用typedef void (deque<int>::*func_ptr)(const int &)?”这是不可能的,因为被访问的函数是一个重载函数,而auto不知道要访问哪个重载。因为原始问题嵌入了函数类型auto的知识,所以语句void(int)选择正确的重载。更简单的陈述的问题在于它烘焙了容器的知识和所包含的类型。如果您想要更改为&deque<int>::push_back,或者从std::vector更改为int,则必须制作所有新类型。使用类型别名,我们可以模拟所有内容以避免嵌入类型知识:

short

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

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

...或者我们可以在某个地方引用容器:

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

...在编译时查找其类型,并存储指向其vector<short> container; 函数的指针,所有这些都不关心容器是什么:

push_back

答案 1 :(得分:1)

push_back()采用const T &参数,错误消息指出:

  

无法转换'void(std :: deque :: *)(const value_type&amp;)...

将您的类型别名更改为:

typedef void (deque<int>::*func_ptr)(const int &);

答案 2 :(得分:-1)

你要做的事情有一个更大的问题。允许实现将默认参数添加到任何成员函数,因此push_back()的实际签名可能不同。它甚至可以添加具有相同名称的其他功能(但签名不同)。

我建议不要指向容器成员函数。没有它你通常会更好。