正在返回指向成员函数的指针(不带typedefs)

Returning pointer-to-member-function (without typedefs)

本文关键字:指针 不带 typedefs 函数 返回 成员      更新时间:2023-10-16

在C++03上编译时,我试图编写一个测试模板函数,该函数返回指向返回int的成员函数的指针,并接受两个浮点参数:

template<typename TemplateClass>
int (TemplateClass::*)(float,float) Testtest(TemplateClass &A)
{
    return &TemplateClass::Function;
}

但很自然,无论我使用的指向成员函数的指针语法有什么变化,编译器都会抱怨初始化错误。Typedef虽然可以处理已知的类,但由于明显的原因(命名冲突),它不会接受我无法提前知道的类的模板类参数,因为这些类可能使用相同的函数。

有什么非typedef方法可以让这个函数编译并返回一个指向成员函数的指针?

在没有类型别名、没有类型推导和没有尾部返回类型的情况下声明它:

template<typename TemplateClass>
int (TemplateClass::* Testtest(TemplateClass &A))(float,float)

但这当然不是你在实际代码中会用到的。相反,你会使用一个别名模板:

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)

您需要这个原型:

template<typename TemplateClass>
int (TemplateClass::*Testtest(TemplateClass &A)) (float,float) { }
  int (Class::*f())(float,float);

f是一个不带参数的函数,返回指向类Class的成员函数的指针,取2个浮点值并返回int。

模板版本:

         template <typename Type>
         int (Type::*f())(float,float);

我拒绝你的问题的前提。使用typedefs。或者,特别是一种类型特征:

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内容。