用模板技术判断一个类型是否为类

纸箱猪 2012-04-30 04:29:29
以下代码是从《C++ Templates》第15.2.2节抄过来的,但是无论在VS2010还是在gcc上都无法通过编译。有没有对模板比较了解的朋友知道这是怎么回事?


// traits/isclasst.hpp

template <typename T>
class IsClassT
{
private:
typedef char One;
typedef struct { char a[2]; } Two;
template<typename C> static One test(int C::*);
template<typename C> static Two test(...);
public:
enum { Yes = sizeof(IsClassT<T>::test<T>(0)) == 1 };
enum { No = !Yes };
};



//traits/isclasst.cpp

#include "isclasst.hpp"
#include <iostream>

using namespace std;

class MyClass
{
};

struct MyStruct
{
};

union MyUnion
{
};

void myfunc()
{
}

enum E { e1 } e;

// Check by passing type as template argument
template <typename T>
void check()
{
if (IsClassT<T>::Yes)
{
cout << " IsClassT " << endl;
}
else
{
cout << " !IsClassT " << endl;
}
}

// Check by passing type as function call argument
template <typename T>
void checkT(T)
{
check<T>();
}

int main()
{
cout << "int: ";
check<int>();

cout << "MyClass: ";
check<MyClass>();

cout << "MyStruct: ";
MyStruct s;
checkT(s);

cout << "MyUnion: ";
check<MyUnion>();

cout << "enum: ";
checkT(e);

cout << "myfunc(): ";
checkT(myfunc);
}
...全文
302 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
baobaodediaozhui 2012-05-02
  • 打赏
  • 举报
回复
水太深,鸭梨好大。。。,向你们学习。。。。
纸箱猪 2012-05-01
  • 打赏
  • 举报
回复
回14楼:的确可以了,而且g++ 4.1.2也能编译了!谢谢!
ri_aje 2012-05-01
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

引用 10 楼 的回复:

引用 5 楼 的回复:

我用 g+=-4.4 都能编译,楼主具体什么错误啊?


看来是我用的gcc老了——才4.1.2。

gcc上的错误是:

isclasst.hpp:17: error: expected primary-expression before ‘>’ token

VS2010下的错误可以用“井喷”来形容,主要是无……
[/Quote]
试了一下,确实一大堆错误。不过你改成这样,vs2010 就可以编译了。

template <typename T>
class IsClassT
{
private:
typedef char One;
typedef struct { char a[2]; } Two;
template<typename C> static One test(int C::*);
template<typename C> static Two test(...);
public:
enum { Yes = sizeof(test<T>(0)) == 1 };
enum { No = !Yes };
};
ri_aje 2012-05-01
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

引用 8 楼 的回复:

远离C++,珍爱生命啊。


哦呵呵,看来本人有点自虐倾向。:-D
[/Quote]
不至于,c++ template 不算过分,支持楼主读完。Modern C++ Design 也很好,expression template 的时候两个都得用,习惯了你就觉得好玩了。
ri_aje 2012-05-01
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

引用 5 楼 的回复:

我用 g+=-4.4 都能编译,楼主具体什么错误啊?


看来是我用的gcc老了——才4.1.2。

gcc上的错误是:

isclasst.hpp:17: error: expected primary-expression before ‘>’ token

VS2010下的错误可以用“井喷”来形容,主要是无法推断(deduce)
……
[/Quote]
4.1.2 是挺老的了,玩模板的话还是新的编译器合适一些。不过 VS2010 也太悲催了,有空我也试一下的。
纸箱猪 2012-05-01
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

远离C++,珍爱生命啊。
[/Quote]

哦呵呵,看来本人有点自虐倾向。:-D
纸箱猪 2012-05-01
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

我用 g+=-4.4 都能编译,楼主具体什么错误啊?
[/Quote]

看来是我用的gcc老了——才4.1.2。

gcc上的错误是:

isclasst.hpp:17: error: expected primary-expression before ‘>’ token

VS2010下的错误可以用“井喷”来形容,主要是无法推断(deduce)

template<typename C> static Two test(...);

中的类型C。
纸箱猪 2012-05-01
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

如果实在空,就先去看《modern c++ design》
否则,别浪费生命折腾模板元编程
[/Quote]

《Modern C++ Design》其实基本上也是模板元编程,而且第一章就是讲Triat和Policy的设计,在《C++ Templates》这才是第15章。
qq120848369 2012-04-30
  • 打赏
  • 举报
回复
远离C++,珍爱生命啊。
taodm 2012-04-30
  • 打赏
  • 举报
回复
如果实在空,就先去看《modern c++ design》
否则,别浪费生命折腾模板元编程
ri_aje 2012-04-30
  • 打赏
  • 举报
回复
sorry, g+=-4.4 -> g++4.4
ri_aje 2012-04-30
  • 打赏
  • 举报
回复
我用 g+=-4.4 都能编译,楼主具体什么错误啊?
纸箱猪 2012-04-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

可以买到啊, 盗版的, 很便宜,20快不到

这书太深了
[/Quote]

原来如此。稍微装一下,其实我好多年没用盗版的东西了。:-P

这书是很深,也就是工作之余读来玩玩。
bsnry 2012-04-30
  • 打赏
  • 举报
回复
可以买到啊, 盗版的, 很便宜,20快不到

这书太深了
纸箱猪 2012-04-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

lz 厉害,这本书我看了第9章,就实在看不下去了,一直么看
[/Quote]

哪里,我只是最近读《C++编程规范》,有几节经常提到Triat类和Policy类,搞得我糊里糊涂,所以干脆找了这本书来钻研,直接读第15章。

这书里面有很多奇淫技巧,感觉看的时候得非常仔细。

话说我在网上书店都买不到这本书了,这书还是从学校图书馆借的。
bsnry 2012-04-30
  • 打赏
  • 举报
回复
lz 厉害,这本书我看了第9章,就实在看不下去了,一直么看

64,654

社区成员

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

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