if和switch结构用模板能等价实现吗?

ryfdizuo 2009-03-27 06:25:54
前两天看模板元编程,google到一篇论文:
http://ubiety.uwaterloo.ca/~tveldhui/papers/Template-Metaprograms/meta-art.html
想必大伙都看到过,
映像最深的是:用模板元等价实现if和switch结构.
但是我有个疑问:模板是在编译器就必须确定,所以作为判断的condition只能是常熟或者const常量等。

//For the if condition
template<bool C>
class IfCondition {};

template<>
class IfCondition<true>
{
public:
inline static void DoFun()
{
using namespace std;
cout << "Now is the true time" << endl;
}
};

template<>
class IfCondition<false>
{
public:
inline static void DoFun()
{
using namespace std;
cout << "Now is the false time" << endl;
}
};

测试:

IfCondition< (2>3) >::DoFun(); //编译器常量表达式可以

int a = 2; int b = 3;
IfCondition< (a>b) >::DoFun(); //不行.

const int a = 2; const int b = 3;
IfCondition< (a>b) >::DoFun(); //OK.

欢迎大鸟,菜鸟来谈谈看法。
...全文
332 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
lin_style 2009-03-30
  • 打赏
  • 举报
回复
看图说话??
xuhb95083023 2009-03-28
  • 打赏
  • 举报
回复
只有编译期能确定才能用模板,否则就不行

IfCondition< (2>3) >::DoFun(); //编译期知道2>3,所以编译期限

int a = 2; int b = 3;
IfCondition< (a>b) >::DoFun(); //编译期不知道a>b 因为a和b都是变量(打个比方,如果有另外一个线程在判断a>b之前修改了a和b的值呢)

const int a = 2; const int b = 3;
IfCondition< (a>b) >::DoFun(); // 都是常量,编译期就知道a>b

if和switch无法绕过,只能用编译期取代运行期
Wolf0403 2009-03-28
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 Wolf0403 的回复:]
引用 11 楼 dizuo 的回复:

程序错误我知道原因,
难道C++就没有什么好的方法取代if,switch繁琐的分支结构?


只能包装,无法绕过。
[/Quote]
用自己的 hash_map,让别人 if-else 去吧。
qqwx_1986 2009-03-28
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 Wolf0403 的回复:]
引用 11 楼 dizuo 的回复:
程序错误我知道原因,
难道C++就没有什么好的方法取代if,switch繁琐的分支结构?


只能包装,无法绕过。
[/Quote]
包装了糊弄调用的人还可以 呵呵

我也想知道怎样不用switch
Wolf0403 2009-03-28
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 dizuo 的回复:]
程序错误我知道原因,
难道C++就没有什么好的方法取代if,switch繁琐的分支结构?
[/Quote]

只能包装,无法绕过。
scott_2009 2009-03-28
  • 打赏
  • 举报
回复
运行期才确定的东西,没办法在编译期使用。
sdljgxb 2009-03-28
  • 打赏
  • 举报
回复
learn
aaaa3105563 2009-03-28
  • 打赏
  • 举报
回复
顶上········
hemiya 2009-03-27
  • 打赏
  • 举报
回复
学习了。
模板也有缺点。
1、增加编译时间。
2、编译后的代码增大。
ryfdizuo 2009-03-27
  • 打赏
  • 举报
回复
程序错误我知道原因,
难道C++就没有什么好的方法取代if,switch繁琐的分支结构?
zeroreal 2009-03-27
  • 打赏
  • 举报
回复
测试:

C/C++ code
IfCondition< (2>3) >::DoFun(); //编译器常量表达式可以

int a = 2; int b = 3;
IfCondition< (a>b) >::DoFun(); //不行.

const int a = 2; const int b = 3;
IfCondition< (a>b) >::DoFun(); //OK.


第一个失败是因为,编译只能编译常量,第一个中两个变量都不是常量;
这样,就解释了第二种情况为什么能够通过

模板元的用处感觉在于,在初始化的时候,将需要计算出的初始化量,先行计算,以提升在运行时的效率。
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fallening 的回复:]
引用 1 楼 akirya 的回复:
不等价.
编译时确定的内容可以用模板代替,不能确定的时候就不能用模板了.

如果不确定的情形少,似乎可以枚举一下:)
比如这个true false只需要两个
[/Quote]
这个怎么枚举?

int main()
{
int a,b;
cin>>a>>b;
if( a>b)
printf("a");
else
printf("b");
};
ltc_mouse 2009-03-27
  • 打赏
  • 举报
回复
进来学习下~ 只知道模板处理的是编译期已知的东西...
  • 打赏
  • 举报
回复
用多态可以动态地代替if和switch,但是用模板的话,只能算是静态的方法。
lingyin55 2009-03-27
  • 打赏
  • 举报
回复
先mark
hylove9494 2009-03-27
  • 打赏
  • 举报
回复
sf
fallening 2009-03-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 akirya 的回复:]
不等价.
编译时确定的内容可以用模板代替,不能确定的时候就不能用模板了.
[/Quote]
如果不确定的情形少,似乎可以枚举一下:)
比如这个true false只需要两个
mengde007 2009-03-27
  • 打赏
  • 举报
回复
模板元程序编译耗时,但是编译耗时的代价换来的是卓越的运行期性能
ryfdizuo 2009-03-27
  • 打赏
  • 举报
回复
up
  • 打赏
  • 举报
回复
不等价.
编译时确定的内容可以用模板代替,不能确定的时候就不能用模板了.

65,211

社区成员

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

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