我已经昏了,关于绑定模板函数的问题

lsaturn 2007-04-04 03:24:08
大家知道boost函数的威力强大,我之前也一直用得很愉快
boost::bind(std::count, _1, _2, _3);
这样的绑定是无法编译通过的,换句话说,就是无法绑定模板函数
是我使用方法没有对,还是确实无法绑定模板函数
我尝试自己写一个对模板函数的bind,好象很棘手,求教
...全文
709 25 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
lsaturn 2007-04-09
  • 打赏
  • 举报
回复
我也研究了,函数模板不能成为模板的模板参数,有的规定还真是感觉不知觉啊
taodm 2007-04-06
  • 打赏
  • 举报
回复
又研究了一下,函数模板不能成为模板的模板参数。
所以,可以放弃了。
taodm 2007-04-06
  • 打赏
  • 举报
回复
本想抄boost::bind写一个的,但boost::bind实在太复杂了,就算了。
lsaturn 2007-04-05
  • 打赏
  • 举报
回复
template<class T>
void fuck()
{

}

template<class T>
void bind(void (*)<T>())
{
}

bind(fuck<int>);

上面这样写测试无法通过,应该怎么写啊?
lsaturn 2007-04-05
  • 打赏
  • 举报
回复
qingcairousi(青耕),你说的没有错,我还有更简单的实现方式,但是我希望只有一个DispatchOneTimer函数,不出现多余的小类,个人审美的偏好
taodm的帖子我看过,实际上由于__LINE__的使用,导致不完美,我尝试写一个实现来再讨论
thinkinnight 2007-04-05
  • 打赏
  • 举报
回复
看看,一直觉得模板有些地方难用,不知什么时候就会有一个无法或者很难搞定的东西出现。学习ing
taodm 2007-04-05
  • 打赏
  • 举报
回复
要自己在编译期生成一个静态的func可以参考这个帖子 http://community.csdn.net/Expert/TopicView.asp?id=5422512

让你自己的bind使用模板的模板参数即可。
EddySoft 2007-04-05
  • 打赏
  • 举报
回复
学习...
taodm 2007-04-05
  • 打赏
  • 举报
回复
template<class T>
void bind(T)
{
}
pass86 2007-04-05
  • 打赏
  • 举报
回复
UPJF
qingcairousi 2007-04-04
  • 打赏
  • 举报
回复
编译多态?
struct base
{
virtual void func()=0;
};
template<typename derivedT>
struct TimerBase:base
{
void func()
{
//using deriveT::timeMsel here
}
long m_elapsed; // 自上一次触发以来经过的实际毫秒数, 和要求的 TimeMsel 可能并不相同
long m_total; // 启动以来的总时间

};

template <timeMsgEnum TimeMsel>
struct Timer_Msg:TimerBase<Timer_Msg<TimeMsel> >//有些时候没用编译多态了,记不清声明是不是这样的了,见谅:)
{
static const int timeMsel=TimeMsel;
};
void DispatchOneTimer(base&, long totalMsel)
{

}
其实就是把DispatchOneTimer里面需要根据类型的不同来作的事情放到TimerBase::func()里面,然后用虚函数做成运行时接口。这样就可以用bind绑定DispatchOneTimer了。
lsaturn 2007-04-04
  • 打赏
  • 举报
回复
编译和运行之间真是有一个巨大的鸿沟啊
lsaturn 2007-04-04
  • 打赏
  • 举报
回复
那我想写一个自己的bind来解决这个问题,这个问题是如何在编译期生成一个静态的func,晕,看来这个问题郁闷了
taodm 2007-04-04
  • 打赏
  • 举报
回复
查了下for_each,必须要functor有一个template的operator()。
你的DispatchOneTimer必须改掉了,bind帮不了你
lsaturn 2007-04-04
  • 打赏
  • 举报
回复
那有办法解决我上面代码里面的问题吗?
我有的解决办法就是生成小类,可是这样就麻烦了
taodm 2007-04-04
  • 打赏
  • 举报
回复
bind不可能绑定模板,它必须绑定类型。
lsaturn 2007-04-04
  • 打赏
  • 举报
回复
typedef enum
{
Time_50ms = 50
, Time_100ms = 100
, Time_200ms = 200
, Time_500ms = 500
, Time_1s = 1000
, Time_2s = 2000
, Time_5s = 5000
, Time_10s = 10000
, Time_30s = 30000
, Time_1m = 60000
, Time_2m = 120000
, Time_5m = 300000
}timeMsgEnum;

template <timeMsgEnum TimeMsel>
struct Timer_Msg
{
long m_elapsed; // 自上一次触发以来经过的实际毫秒数, 和要求的 TimeMsel 可能并不相同
long m_total; // 启动以来的总时间
};

typedef boost::mpl::vector<
Timer_Msg<Time_50ms >
, Timer_Msg<Time_100ms>
, Timer_Msg<Time_200ms>
, Timer_Msg<Time_500ms>
, Timer_Msg<Time_1s >
, Timer_Msg<Time_2s >
, Timer_Msg<Time_5s >
, Timer_Msg<Time_10s >
, Timer_Msg<Time_30s >
, Timer_Msg<Time_1m >
, Timer_Msg<Time_2m >
, Timer_Msg<Time_5m >
> time_list_t;

template <timeMsgEnum MsgEnum>
void DispatchOneTimer(Timer_Msg<MsgEnum>, long totalMsel)
{

}

boost::mpl::for_each<time_list_t>(boost::bind(DispatchOneTimer, _1, 123));//此处无法编译通过
taodm 2007-04-04
  • 打赏
  • 举报
回复
你在说什么呀,贴全你的代码。
lsaturn 2007-04-04
  • 打赏
  • 举报
回复
我要是用mpl的for_each,传过来的是类型,而不是值啊
  • 打赏
  • 举报
回复
不用啊用taodm的方法
模板函数写上参数的话就可以bind的
加载更多回复(5)

65,186

社区成员

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

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