返回指向成员函数的指针(没有类型定义)
Returning pointer-to-member-function (without typedefs)
在 C++03 上编译,我试图编写一个测试模板函数,该函数 return 是 return int 成员函数的成员函数指针,并接受两个浮点参数:
template<typename TemplateClass>
int (TemplateClass::*)(float,float) Testtest(TemplateClass &A)
{
return &TemplateClass::Function;
}
但很自然地,无论我使用指向成员函数的指针语法的什么变体,编译器都会抱怨初始化错误。 Typedef,虽然它与已知的 classes 一起工作,但出于明显的原因(命名冲突),不会接受 classes 的模板 class 参数,我无法提前知道哪个很可能会使用相同的功能。
有什么非 typedef 方法可以编译此函数并 return 指向成员函数的指针?
int (Class::*f())(float,float);
f
是不带参数的函数,返回指向 class Class
takinf 2 浮点数并返回 int 的成员函数的指针。
和模板版本:
template <typename Type>
int (Type::*f())(float,float);
要在没有类型别名、没有类型推导和没有尾随 return 类型的情况下声明它:
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)
或return C++14 中的类型推导:
template<typename TemplateClass>
auto Testtest(TemplateClass &A)
或尾随 return 类型(在 C++11 中):
template<typename TemplateClass>
auto Testtest(TemplateClass &A) -> int (TemplateClass::*)(float,float)
您需要这个原型:
template<typename TemplateClass>
int (TemplateClass::*Testtest(TemplateClass &A)) (float,float) { }
我拒绝你问题的前提。使用 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
内容。
在 C++03 上编译,我试图编写一个测试模板函数,该函数 return 是 return int 成员函数的成员函数指针,并接受两个浮点参数:
template<typename TemplateClass>
int (TemplateClass::*)(float,float) Testtest(TemplateClass &A)
{
return &TemplateClass::Function;
}
但很自然地,无论我使用指向成员函数的指针语法的什么变体,编译器都会抱怨初始化错误。 Typedef,虽然它与已知的 classes 一起工作,但出于明显的原因(命名冲突),不会接受 classes 的模板 class 参数,我无法提前知道哪个很可能会使用相同的功能。
有什么非 typedef 方法可以编译此函数并 return 指向成员函数的指针?
int (Class::*f())(float,float);
f
是不带参数的函数,返回指向 class Class
takinf 2 浮点数并返回 int 的成员函数的指针。
和模板版本:
template <typename Type>
int (Type::*f())(float,float);
要在没有类型别名、没有类型推导和没有尾随 return 类型的情况下声明它:
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)
或return C++14 中的类型推导:
template<typename TemplateClass>
auto Testtest(TemplateClass &A)
或尾随 return 类型(在 C++11 中):
template<typename TemplateClass>
auto Testtest(TemplateClass &A) -> int (TemplateClass::*)(float,float)
您需要这个原型:
template<typename TemplateClass>
int (TemplateClass::*Testtest(TemplateClass &A)) (float,float) { }
我拒绝你问题的前提。使用 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
内容。