bobo_包子 架构师  2014年01月05日
C++模板问题
最近看了下C++ templates,其中有个判断类型的tool,
Original如下:
template<typename T>
class IsFunction
{
private:
typedef struct {} One;
typedef struct { One a[2]; } Two;
template<typename U> static One testFunction(...);
template<typename U> static Two testFunction(U (*)[1] );
public:
enum { YES = sizeof(IsFunction<T>::testFunction<T>(0)) == sizeof(One) };
enum { NO = !YES };
};

测试程序如下:
void fun() {}

template<typename T>
void checkFun(T *t)
{
if(IsFunction<T>::YES)
cout << "is function!" << endl;
else
cout << "is not function!" << endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
Fun myFun = &fun;
int *pa;
checkFun(pa); // {1}
checkFun(myFun); // {2}
//IsFunction<cl>::YES;
getchar();
return 0;
}

OK这段代码的意思我也明白,主要用了数组和函数重载的一些知识。这段代码是不能编译的,必须做修改。
Modified 1:
template<typename T>
class IsFunction
{
private:
typedef struct {} One;
typedef struct { One a[2]; } Two;
static One testFunction(...);
static Two testFunction(U (*)[1] );
public:
enum { YES = sizeof(IsFunction<T>::testFunction(0)) == sizeof(One) };
enum { NO = !YES };
};


测试结果:不能编译
error:'abstract declarator' array element type cannot be function

Modified 2:
template<typename T>
class IsFunction
{
private:
typedef struct {} One;
typedef struct { One a[2]; } Two;
template<typename U> static One testFunction(...);
template<typename U> static Two testFunction(U (*)[1] );
public:
enum { YES = sizeof(testFunction<T>(0)) == sizeof(One) };
enum { NO = !YES };
};

测试结果:OK

Modified 3:
	typedef struct {} One;
typedef struct { One a[2]; } Two;
template<typename U> static One testFunction(...);
template<typename U> static Two testFunction(U (*)[1] );

放到class外边,测试结果与2相同。

谁能帮解释下,我觉得1不能通过编译的原因是没有使用重载解析
...全文
451 点赞 收藏 24
写回复
24 条回复

还没有回复,快来抢沙发~

发动态
发帖子
C++ 语言
创建于2007-09-28

3.1w+

社区成员

24.8w+

社区内容

C++ 语言相关问题讨论,技术干货分享
社区公告
暂无公告