社区
C++ 语言
帖子详情
我已经昏了,关于绑定模板函数的问题
lsaturn
2007-04-04 03:24:08
大家知道boost函数的威力强大,我之前也一直用得很愉快
boost::bind(std::count, _1, _2, _3);
这样的绑定是无法编译通过的,换句话说,就是无法绑定模板函数
是我使用方法没有对,还是确实无法绑定模板函数
我尝试自己写一个对模板函数的bind,好象很棘手,求教
...全文
807
25
打赏
收藏
我已经昏了,关于绑定模板函数的问题
大家知道boost函数的威力强大,我之前也一直用得很愉快 boost::bind(std::count, _1, _2, _3); 这样的绑定是无法编译通过的,换句话说,就是无法绑定模板函数 是我使用方法没有对,还是确实无法绑定模板函数 我尝试自己写一个对模板函数的bind,好象很棘手,求教
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用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,传过来的是类型,而不是值啊
珍惜生命远离CPP
2007-04-04
打赏
举报
回复
不用啊用taodm的方法
模板函数写上参数的话就可以bind的
加载更多回复(5)
java面试题:为什么 StringBuilder 不是线程安全的?
引言 面试官:StringBuilder和StringBuffer的区别在哪? 我:StringBuilder不是线程安全的,StringBuffer是线程安全的 面试官:那StringBuilder不安全的点在哪儿? 我:。。。(哑巴了) 在这之前我只记住了StringBuilder不是线程安全的,StringBuffer是线程安全的这个结论,至于StringBuilder为什么不安全从来没有去...
String、StringBuffer和StringBuilder的区别(面试题)
StringBuilder是可变的,而String是不可变的。当我们对一个已有的字符串进行拼接或修改时,String会创建一个新的字符串对象,而原来的字符串对象保持不变。这意味着每次拼接或修改都会生成一个新的字符串对象,导致频繁的对象创建和销毁,造成内存和性能的浪费。相反,StringBuilder可以在一个可变的字符串缓冲区中进行修改,避免了创建新对象的开销。
Java 面试题:String、StringBuffer、StringBuilder 有什么区别?
几乎所有的应用开发都离不开操作字符串,理解字符串的设计和实现以及相关工具如拼接类的使用,对写出高质量代码是非常有帮助的。关于这个
问题
,我前面的回答是一个通常的概要性回答,至少你要知道 String 是 Immutable 的,字符串操作不当可能会产生大量临时字符串,以及线程安全方面的区别。
StringBuffer和StringBuilder是否线程安全
今天小G看有一个面试题在问,StringBuffer和StringBuilder是否线程安全,所以在此写一个博客说明下, 二话不说,上代码程序员必备(小G:答案是stringBuffer是线程安全) StringBuffer buffer= new StringBuffer(); buffer.append("d"); 然后我们进入appen里面看看 @Override public...
为什么StringBuilder是线程不安全的?
在前面的面试题讲解中我们对比了String、StringBuilder和StringBuffer的区别,其中一项便提到StringBuilder是非线程安全的,那么是什么原因导致了StringBuilder的线程不安全呢? 原因分析 如果你看了StringBuilder或StringBuffer的源代码会说,因为StringBuilder在append操作时并未使用线程同步,而StringBuffer几乎大部分方法都使用了synchronized关键字进行方法级别的同步处理。 上面这种说法肯定是正确的,对照
C++ 语言
65,213
社区成员
250,514
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章