定义指向模板函数的函数指针类型

探讨C++中模板函数指针的定义难题,由于C++标准不支持直接定义模板函数指针,博主尝试了多种方式均报错。文章讨论了如何通过其他手段实现类似功能。

http://bbs.youkuaiyun.com/topics/390010520


C/C++ code
?
1
2
3
4
5
template  < typename  PktType>
typedef  int  (* CallbackFunPtrType) ( const  PktType& CurPkt); //1,提示编译错误
 
template  < typename  PktType>
int  (* CallbackFunPtr1) ( const  PktType& CurPkt); //2,提示编译错误



现在需要定义一个指向模板函数的函数指针类型,查了相关资料得知现在c++好像不支持这个特性。

vs2008发现,不但不能用typedef定义指向模板函数的函数指针类型,1处所示;连定义一个指向模板函数的函数指针都不可以,2处所示。
有没有其他巧妙的方法可以实现?求赐教!




c++11 14/1 says
A template defines a family of classes or functions or an alias for a family of types.
因此,不存在 function pointer template.
另外,你的概念似乎有些混淆。c++ 标准中不存在模板函数的概念,因此也不存在"模板函数的函数指针"。c++ 中只有函数模板,注意函数模板是一个模板,不是函数,因此也不存在指向它的指针。
你还是说说到底要干嘛吧,说不定不用这么麻烦呢。



如果LZ是需要一个指向函数模板的指针的话,建议参考STL中仿函数的实现

你可以用你现在需要被指向的函数当做一个参数传给仿函数的构造器,然后重载()运算符即可


引用 6 楼 mingliang1212 的回复:
引用 3 楼 的回复:

一个简单的原因就是,模板在实例化之前就不存在,所以你这个所谓的模板函数的指针在类型未确定之前根本就没意义。

negetive , 
模板是一个实体(entity),模板可以作为模板参数.

但是指针指向的是一个对象或函数,故不能指向模板.
你还是没理解我的意思,模板可以作为参数这点没错,但是这里不同。LZ的两种形式 1.typedef是想定义一个类型别名,很明显这个指针的类型根本不确定 2.声明一个指针,同样这个指针的类型也不确定。当然编译无法通过。而你所说的作为参数 我们在使用的时候在传递参数的时候不会出现类型不确定这回事。


template <typename PktType>
struct Wrapper
{
typedef int (* CallbackFunPtrType) (const PktType& CurPkt);
};
这样不就行了
用的时候就
Wrapper<int>::CallbackFunPtrType callback=....


支持C++11的话,用std::function。不支持的话,用boost::function。

<think>好的,用户问的是C++函数模板能否返回函数指针。我需要先确认这个问题的答案。首先,函数模板在C++中是用来生成函数的,而函数指针指向特定函数类型的指针。函数模板本身不能直接返回一个函数指针,因为模板是一个蓝图,需要实例化后才能生成具体的函数。 不过,可能用户想表达的是,函数模板实例化后的函数是否可以返回函数指针。比如,函数模板内部可能返回某个函数的指针,或者返回一个指向通过模板参数传入的函数的指针。这时候需要看具体的情况。例如,模板参数可以是一个函数类型,然后函数模板返回该类型的指针,但这可能需要特定的语法处理。 另外,可能用户混淆了函数模板模板函数的概念。函数模板是生成函数模板,而模板函数是实例化后的具体函数。所以函数模板本身不返回任何东西,只有实例化后的函数才能有返回值。 可能的解决方案是,使用函数模板生成一个函数,该函数返回一个函数指针。例如,定义一个函数模板,其返回类型是一个函数指针指向某个特定类型函数。这时候需要正确声明返回类型,比如使用typedef或者using来定义函数指针类型,或者在C++11中使用std::function和lambda表达式,但用户明确问的是函数指针。 举个例子,比如有一个函数模板,根据不同的类型参数返回不同的函数指针。例如,根据类型选择不同的处理函数。这时候需要确保返回的函数指针类型正确,并且与调用的函数匹配。 需要检查语法是否正确。例如: template <typename T> T (*func())(T, T) { // 返回一个指向函数的指针,该函数接受两个T参数,返回T } 或者更复杂的例子,可能涉及模板参数作为函数参数类型的一部分。 另外,可能用户的问题涉及到如何从函数模板中返回一个函数指针,这时候可能需要使用模板的特化或者条件判断来选择不同的函数。例如,根据类型的不同返回不同的函数地址。 总结:函数模板本身不能返回函数指针,但模板实例化后的函数可以返回函数指针。需要正确声明返回类型,并确保返回的指针类型函数模板的实例化类型匹配。 然后需要给出示例代码,展示如何实现这一点。例如,一个函数模板返回某个操作函数的指针,根据类型不同返回不同的函数。 接下来,用户可能的相关问题可能包括:如何声明返回函数指针函数模板函数指针类型匹配的重要性、使用using或typedef简化声明的方法、函数模板参数推导的问题,以及可能的替代方案如std::function或lambda表达式。 需要确保回答正确,并且示例代码符合C++标准,没有语法错误。同时,相关问题要围绕用户的问题展开,帮助用户深入理解相关概念。</think>C++函数模板本身不能直接返回函数指针,但可以通过模板实例化生成的函数返回函数指针。关键在于函数模板的返回类型需要明确声明为函数指针类型。例如: ```cpp // 声明一个函数指针类型 using FuncPtr = int (*)(int, int); // 函数模板返回函数指针 template<typename T> FuncPtr getFunction() { return [](int a, int b) -> int { return a + b; }; // 返回lambda表达式(可隐式转换为函数指针) } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值