求解决一个可变参数的函数传递的问题。

musicion8168 2018-03-09 04:36:42

template<class T, class... P>
int TaskPro(T&& fc, P&&... pm)

这个函数用来处理各种作业。
当我不使用类,直接用函数:

int FuncA(int nParamCount, ...)
{}

此时

TaskPro(FuncA, 1, 2)

都能通过编译并且能正常运行.

但当我使用类时

class clA
{
public:
int FuncA(int nParamCount, ...) {};
};


此时

TaskPro(&clA::FuncA, 1, 2)

编译不过.
用std::fuction也编译不过.请高手支招。
...全文
427 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
mstlq 2018-03-10
  • 打赏
  • 举报
回复
非静态成员函数的调用必须通过对象,所以像5楼那么做就可以了
幻夢之葉 2018-03-09
  • 打赏
  • 举报
回复
这不是明显的么,非静态成员函数的调用必须通过对象(this) 我猜测:你模板函数的实现上有调用该函数的操作,导致编译错误 2L中的

template<class T, class... P>
int TaskPro(T&& fc, P&&... pm){
    return 0;
}
参数什么都没用到,当然能编译通过 试试第二个参数带着一个与函数所属类类型的对象,类似C++11中std::bind的用法
zilaishuichina 2018-03-09
  • 打赏
  • 举报
回复

template<class O, class T, class... P>
int TaskPro(O&& obj, T&& fc, P&&... pm) 
{
	return (obj.*fc)(pm...);
}

class clA
{
public:
	int FuncA(int nParamCount, ...) 
	{
		return 0;
	};
};

int main(int argc, char* argv[])
{
	clA a;
	typedef int (clA::*fun)(int, ...);
	fun p = &clA::FuncA;
	TaskPro(a, p, 1, 2);
}
成员函数的版本, 这样应该可以
zilaishuichina 2018-03-09
  • 打赏
  • 举报
回复
引用 2 楼 yangbomoto 的回复:
#include<iostream>
#include<string>
#include<stdio.h>
using namespace std;

int FuncA(int nParamCount, ...){
	return 0;
}

template<class T, class... P>
int TaskPro(T&& fc, P&&... pm){
	return 0;
}

class clA
{
public:
	int FuncA(int nParamCount, ...) { 
		return 0;
	};
};

int main(){

	TaskPro(FuncA, 1, 2);

	TaskPro(&clA::FuncA, 1, 2);

    cout<<"Hello....."<<endl;
    system("pause");
    return 0;
}
上面代码编译可以通过
你这个能通过是因为 TaskPro里面 没有使用到 fc, 调用了fc就通不过了
zilaishuichina 2018-03-09
  • 打赏
  • 举报
回复
引用 1 楼 zilaishuichina 的回复:

class clA
{
public:
	static int FuncA(int nParamCount, ...) 
	{
		return 0;
	};
};

TaskPro(clA::FuncA, 1, 2)
或者

class clA
{
public:
	int FuncA(int nParamCount, ...) 
	{
		return 0;
	};
};

clA a;
TaskPro(a.FuncA, 1, 2)
试了一下 成员函数好像不行, 静态函数可以。。。。
嘿碳头 2018-03-09
  • 打赏
  • 举报
回复
#include<iostream>
#include<string>
#include<stdio.h>
using namespace std;

int FuncA(int nParamCount, ...){
	return 0;
}

template<class T, class... P>
int TaskPro(T&& fc, P&&... pm){
	return 0;
}

class clA
{
public:
	int FuncA(int nParamCount, ...) { 
		return 0;
	};
};

int main(){

	TaskPro(FuncA, 1, 2);

	TaskPro(&clA::FuncA, 1, 2);

    cout<<"Hello....."<<endl;
    system("pause");
    return 0;
}
上面代码编译可以通过
zilaishuichina 2018-03-09
  • 打赏
  • 举报
回复

class clA
{
public:
	static int FuncA(int nParamCount, ...) 
	{
		return 0;
	};
};

TaskPro(clA::FuncA, 1, 2)
或者

class clA
{
public:
	int FuncA(int nParamCount, ...) 
	{
		return 0;
	};
};

clA a;
TaskPro(a.FuncA, 1, 2)

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧