How to ensure two template member functions specificated with same type?

noho 2002-12-30 03:53:04
class A
{
template<typename T> foo(T *);
template<typename T> bar(T *);
};

except for using RTTI technology.
Any suggestion are appreciated.
...全文
92 8 打赏 收藏 举报
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
noho 2003-01-06
//nod
有人从理论上证明了compile-time check是不可能的。
结贴。
  • 打赏
  • 举报
回复
rushman 2003-01-04
--如果foo不是foo,而是class A的构造函数呢?
如果foo是class A的构造函数,那就需要将这个类进行封装(使用这个类的实例)。既然这样,为什么不把它设计成模板?如果需要,可以先设计一个虚基类,再派生出来这个模板。这样一般来说,可以实现与你的类相同的功能。
反过来,也说明你在类的设计上先天就有问题。有时候,不一定非要在墙上打个洞再钻过去,退一步,也许就会发现另有通途。^_^
  • 打赏
  • 举报
回复
noho 2003-01-04
如果foo不是foo,而是class A的构造函数呢?
  • 打赏
  • 举报
回复
rushman 2003-01-01
Happy new year..........
  • 打赏
  • 举报
回复
rushman 2003-01-01
既然能在编译期进行检查,就说明这两个函数的调用是由程序员安排的,所以我认为关键应该在于调用时的处理。
为了不至于在调用时产生混乱,应该将对这两个函数的调用部分封装起来。

首先,将这两个函数保护(protected)起来,然后,将调用这两个函数的代码放在一起,外部只能通过这些接口来访问。

//----------------------------------------------
另写一个模板函数当作跳板来调用这两个函数。
templact<class T>
void function(T * ){
foo(...);
bar(...);
}

//----------------------------------------------
把两个函数变成一个函数。从软件工程的角度,这是个馊主意。从面向对象的角度,这叫基于消息???^_^
template<class T>
void function(T*p,int msg)
{
switch(msg){
case FOO:....
case BAR:....
......
}
}

//---------------------------------------------
将这两个函数调用的接口设计成类,灵活性、封装和实用性更好。
template<class T>
class X{
public:
//使其界面象一个函数
void operator()(int msg,T*)
{
switch(msg){
case FOO:....
case BAR:....
......
}
}
};
  • 打赏
  • 举报
回复
noho 2002-12-31
我找到了一个方法,可惜是在运行时检查,不知道哪位能提供编译时检查的版本。
template<typename T>
struct TypeInfo
{
static void constraints(void){};
};
class A
{
template<typename T> foo(T *)
{
constraints = &TypeInfo<T>::constraints;
}
template<typename T> bar(T *)
{
assert(constraints == &TypeInfo<T>::constraints);
}
void (*constraints)();
};

foo一定先于bar调用。
  • 打赏
  • 举报
回复
qing_li73 2002-12-31
concern
  • 打赏
  • 举报
回复
zfluo 2002-12-31
template <class T>
class A
{
void foo(T*);
void bar(T*);
};
  • 打赏
  • 举报
回复
发帖
工具平台和程序库

2.4w+

社区成员

C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
帖子事件
创建了帖子
2002-12-30 03:53
社区公告
暂无公告