如何解决模板化函数指针,这可能吗?
|template<typename T>
std::vector<unsigned>
Traverse
(
unsigned start_node,std::priority_queue
<
std::pair< unsigned,unsigned >,std::vector< std::pair<unsigned,unsigned> >,bool(*T)(const unsigned&,const unsigned&)
> &pQueue
) const;
上面的代码基本上不会编译。我认为其语法错误与以下行:
bool(*T)(const unsigned&,const unsigned&)
正确的语法是什么?
谢谢。
编辑:
@ 詹姆士,
这是const类成员函数模板的声明。
该函数采用以下参数
1)一个无符号的int
2)priority_queue,以客户端指定的任意方式排序
该函数返回一个无符号整数的向量。
解决方法
尝试这个:
template<typename T>
std::vector<unsigned>
Traverse
(
unsigned start_node,std::priority_queue
<
std::pair< unsigned,unsigned >,std::vector< std::pair<unsigned,unsigned> >,T
> &pQueue
) const;
,为什么需要功能指针作为模板参数? std::priority_queue
需要一个函数类(如less <>,它已定义了operator()),而不是C样式的函数指针。
即使没有模板参数,以下代码也不起作用:
bool(*fn)(const unsigned&,const unsigned&) = 0;
std::priority_queue<std::pair<unsigned,unsigned>,std::vector<std::pair<unsigned,unsigned>>,fn> q;
你需要做的是罗伯建议的:
template<typename T>
std::vector<unsigned>
Traverse
(
unsigned start_node,T
> &pQueue
) const;
其中T是比较器类型。
,ѭ6是独立功能吗?如果是,则应在最后删除ѭ7。它随着这种变化而编译。同样将(*T)
更改为simply9ѭ。
如果它是类的成员,那么它也应该编译。
,从这里派生。
priority_queue接受compare参数的函数指针,但是您必须将函数指针传递给构造函数,而不是模板。该模板将只接受函数指针的类型。
实现此功能的最简单方法是使用仿函数(函数对象,谓词类或您自己命名的类)。
从该函子,您也可以调用函数指针,前提是在编译时全局知道该函数指针。但我认为并非如此,因此您可能毕竟必须走“在构造函数中传递函数指针”的路线。
如果在编译时知道函数地址:
typedef bool (*MyFuncPtr)(const unsigned&,const unsigned&);
MyFuncPtr globalPtr = myCompareFunction;
struct MyCompare {
bool operator()(const unsigned &a,const unsigned &b) const {
return globalPtr(a,b);
}
};
std::vector<unsigned>
Traverse
(
unsigned start_node,MyCompare
> &pQueue
) const;
如果不是:
typedef bool (*MyFuncPtr)(const unsigned&,const unsigned&);
typedef std::priority_queue
<
std::pair< unsigned,MyFuncPtr
> MyQueue;
std::vector<unsigned>
Traverse
(
unsigned start_node,MyQueue &pQueue
) const;
int main() {
MyQueue queue(myCompareFunction);
Traverse(...,queue);
}
简而言之,模板在这里几乎没有用,因为函数不是类型,并且比较函数的类型是100%预定的(它是MyQueue)。编译器将没有任何信息可以根据传递给Traverse()的参数来推断特定类型。
如果您实际上不需要在运行时动态更改比较函数,则这里的其他答案是正确的方法。只需将T作为第三个模板参数传递给您的priority_queue。
,您的编辑会有所帮助。仍然有一个问题
std::priority_queue
不是类型,因此您无法声明
使用它的功能。但是既然您已经有了模板,
最简单的解决方案是:
template<typename T,typename Q>
std::vector<unsigned>
Travers( unsigned start_node,Q& pQueue ) const;
试图将ѭ14限制为的一组实例
毫无疑问,priority_queue
是可以做到的,但这将是棘手的;
您可能需要使用以下模板包装器类
模板参数和部分专业化。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。