在C ++ 03上编译,我试图编写一个测试模板函数,它返回一个返回int的成员函数的指向成员函数的函数,并获取两个float参数:
template<typename TemplateClass>
int (TemplateClass::*)(float,float) Testtest(TemplateClass &A)
{
return &TemplateClass::Function;
}
但很自然,无论我使用的指向成员函数的语法有什么变化,编译器都会抱怨初始化错误。 Typedef,虽然它适用于已知的类,但由于显而易见的原因(命名冲突),我们不能接受我不能提前知道的类的模板类参数,这些类可能使用相同的函数。
有什么非typedef方法可以让这个函数编译并返回一个指向成员函数的指针?
答案 0 :(得分:5)
要声明它没有类型别名,没有类型推导,也没有尾随返回类型:
template<typename TemplateClass>
int (TemplateClass::* Testtest(TemplateClass &A))(float,float)
但当然这不是你在真实代码中使用的东西。相反,你会使用alias template:
template<typename T>
using return_type = int (T::*)(float,float);
template<typename TemplateClass>
return_type<TemplateClass> Testtest(TemplateClass &A)
或者在C ++ 14中返回类型推导:
template<typename TemplateClass>
auto Testtest(TemplateClass &A)
或尾部返回类型(在C ++ 11中):
template<typename TemplateClass>
auto Testtest(TemplateClass &A) -> int (TemplateClass::*)(float,float)
答案 1 :(得分:3)
你需要这个原型:
template<typename TemplateClass>
int (TemplateClass::*Testtest(TemplateClass &A)) (float,float) { }
答案 2 :(得分:2)
int (Class::*f())(float,float);
f
是不带参数的函数,返回指向类Class
的成员函数的指针takinf 2浮动并返回int。
模板版本:
template <typename Type>
int (Type::*f())(float,float);
答案 3 :(得分:0)
我拒绝你的问题的前提。使用typedef。或者,具体来说,是一种类型特征:
template <class T, class F>
struct make_mem_fun {
typedef F T::*type;
};
template<typename TemplateClass>
typename make_mem_fun<TemplateClass, int(float, float)>::type
Testtest(TemplateClass &A)
{
return &TemplateClass::Function;
}
这比实际返回类型的复杂语法更容易理解。使用C ++ 11,我们可以将其转换为别名以删除typename ::type
内容。