#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。
答案 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()
的实际签名可能不同。它甚至可以添加具有相同名称的其他功能(但签名不同)。
我建议不要指向容器成员函数。没有它你通常会更好。