求 .net Func 的c++实现

ofei 2009-07-14 02:01:37
有两个 Func<T>, Func<T,byte[]>

以下是我写的代码:
template <typename T,typename R,R (*Callback)()>
class Help
{
public:
Help(T& t)
{
obj(t);
}
R Exec()
{
return obj.*Callback();
}

private:
T& obj;
};

class Demo
{
public:
int GetInt32()
{
return 20;
}
};

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
Demo d;

Help<Demo,int,&Demo::GetInt32> cb(d);

return 0;
}

编译出现提示
“Help”的模板参数无效,应为编译时常量表达式
GetInt32是实例方法,不能修改
请教各位该怎么修改,谢谢
...全文
127 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ofei 2009-07-15
  • 打赏
  • 举报
回复
晕,搞错了一个地方
可以正常运行了

3q
goodname 2009-07-15
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ofei 的回复:]
哈哈 还是有问题!

[/Quote]

你应该使用2楼的程序。3楼的只是我调试过程中一个错误的例子,用以说明最后那句话的---看来编译模板对于编译器来说确实是个很大的挑战。
Aeris 2009-07-14
  • 打赏
  • 举报
回复
试试Boost.Function,会让你有意外惊喜的


void do_sum_avg(int values[], int n, int& sum, float& avg)
{
sum = 0;
for (int i = 0; i < n; i++)
sum += values[i];
avg = (float)sum / n;
}

int main()
{
boost::function<void (int values[], int n, int& sum, float& avg)> sum_avg;

sum_avg = &do_sum_avg;

int values[] = {1, 2, 3, 4, 5};
int s;
float av;
sum_avg(values, 5, &s, &av);

return 0;
}

ofei 2009-07-14
  • 打赏
  • 举报
回复
哈哈 还是有问题!

// cpptest.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "cpptest.h"

template <typename T,typename R,int (T::*Callback)()>//用vc2005调试过程中把T::Callback误写为R::Callback了,结果报错
class Help
{
public:
Help(T& t): obj(t)
{

}
R Exec()
{
return (obj.*Callback)();
}

private:
T& obj;
};

class Demo
{
public:
int GetInt32()
{
return 20;
}

double GetDouble()
{
return 20.0;
}
};

int main(int argc, char* argv[])
{
Demo d;

Help <Demo,double,&Demo::GetDouble> cb(d);

double i = cb.Exec();

return 0;
}

当添加GetDouble函数的时候编译不过
goodname 2009-07-14
  • 打赏
  • 举报
回复

template <typename T,typename R,int (R::*Callback)()>//用vc2005调试过程中把T::Callback误写为R::Callback了,结果报错
class Help
{
public:
Help(T& t): obj(t)
{

}
R Exec()
{
return (obj.*Callback)();
}

private:
T& obj;
};

class Demo
{
public:
int GetInt32()
{
return 20;
}
};

int main(int argc, char* argv[])
{
Demo d;

Help <Demo,int,&Demo::GetInt32> cb(d);

return 0;
}




结果报错误为
------ 已启动生成: 项目: test, 配置: Debug Win32 ------
正在编译...
test.cpp
d:\vc8app\test\test.cpp(34) : fatal error C1001: 编译器中发生内部错误。
(编译器文件“msc1.cpp”,第 1393 行)
要解决此问题,请尝试简化或更改上面所列位置附近的程序。
请选择 Visual C++
“帮助”菜单上的“技术支持”命令,或打开技术支持帮助文件来获得详细信息。
生成日志保存在“file://d:\vc8app\test\Debug\BuildLog.htm”
test - 1 个错误,0 个警告
========== 生成: 0 已成功, 1 已失败, 0 最新, 0 已跳过 ==========


而且还弹出了一个发送错误信息的对话框,看来编译模板对于编译器来说确实是个很大的挑战。
goodname 2009-07-14
  • 打赏
  • 举报
回复


#include <iostream>
using namespace std;

template <typename T,typename R,R (T::*Callback)()>
class Help
{
public:
Help(T& t):obj(t)
{
}
R Exec()
{
return (obj.*Callback)();
}

private:
T& obj;
};

class Demo
{
public:
int GetInt32()
{
return 20;
}
};

int main(int argc, char* argv[])
{
Demo d;

Help <Demo,int,&Demo::GetInt32> cb(d);

cout<<cb.Exec()<<endl;

return 0;
}
_saga 2009-07-14
  • 打赏
  • 举报
回复
template <typename T,typename R, R ( T::*Callback)()>
class Help
{
public:
Help(T& t)
{
obj=t;
}
R Exec()
{
return (obj.*Callback)();
}

private:
T obj;
};

class DemoParent
{
public:
virtual int GetInt32()=0;
};

class Demo : public DemoParent
{
public:
virtual int GetInt32()
{
return 20;
}
};

#include <tchar.h>
#include <iostream>
using namespace std;
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
Demo d;

Help <Demo,int,&Demo::GetInt32> cb(d);
cout<<cb.Exec()<<endl;

return 0;
}

65,186

社区成员

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

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