我正在为正在进行的项目编写一些辅助函数。我一直想要一个typeof操作符。我知道它在我当前的IDE(visual studio '10)中不存在,所以我试着为它编写一个实现。它应该是这样的:
auto var = new typeof(<expression>);
它应该只是一个基于表达式的编译时可检索类型,应该是可能的。 C ++在引入模板参数时使用它,例如:
template< typename A >
void foo(A unused) {
/* can be invoked like foo(5) with A = int */
typedef A type;
type * used = new type;
}
所以我认为我可以使用宏,类和模板......这样的事情:
#define typeof(expression) (_type_creater().inducer(expression)::type)
template<typename T>
class _type_holder{
public:
typedef T type;
};
class _type_creater{
public:
template< class B >
_type_holder<B> inducer(B _temp) {
/* Here compiler induces the templated expression and creates a typename out of it.
this we can use extract typename from _type_holder, except a instantiatet type apparantly
doesn't have access to typedef'd typenames.
*/
return _type_holder<B>();
}
};
所以问题基本上是,这是非法的:
struct a
{
typedef int type;
}
...
a mya;
new mya::type; //or mya.type
所以第一个问题是,为什么这是非法的?为什么不能从instantiatet类型中检索类型名? 第二个问题,我可以这样做吗?我试着看看增强版TYPEOF,但对它没有多大意义,似乎它只是利用VC编译器中的错误(“//VC7.0特定bugfeature”,“// VC8.0特定bugfeature”,“/ /这使用了漂亮的VC6.5和VC7.1 bugfeature“)。 我运气不好吗?
答案 0 :(得分:0)
对象不是范围。范围解析运算符(::
)仅适用于范围(类范围,命名空间范围,全局(命名空间)范围)。我在这个问题的评论中给出了一些额外的信息作为理论。