正在返回指向成员函数的指针(不带typedefs)
Returning pointer-to-member-function (without typedefs)
在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
内容。
相关文章:
- f 是指向函数的指针,该函数采用 int,并返回指向不带任何内容并返回双精度的函数的指针
- 创建不带指针的可变大小数组
- 更改类 | 中的结构或类,带或不带指针
- 返回带或不带 *this 的变量的确切方式不同 |这不是关于*此指针|正确性
- 不带星号的函数指针参数
- 返回函数指针错误而不带类型定义
- C++ 中的 C 库回调,不带指向"this"的指针
- 从不同基类的基指针强制转换为基类(最好不带 dynamic_cast)
- 不带指针的动态数组 C++
- 正在返回指向成员函数的指针(不带typedefs)
- 复制不带指针的结构
- 不带指针的继承
- 将整数传递到函数中的数组(不带指针)
- C++ 不带指针的复制结构
- 递增指针时带或不带星号
- 为什么这不是内存泄漏?还是吗?删除不带虚拟析构函数的基类指针
- 成员初始值设定项列表,不带参数的指针初始化
- 将指针分配给带或不带限定符的指针
- 如何用函数指针(不带auto)声明lambda
- 移动不带指针的构造函数