如何确定C ++对象是否为time_t

时间:2012-02-17 21:21:51

标签: c++ templates typedef rtti template-specialization

如何确定C ++对象是否是time_t,而不是整数类型time_t被定义为?

我特意想模板专门化一个函数,

template <typename T> void myFunction( T val );
template<>            void myFunction<time_t>( time_t val );

这样当定义了time_t的整数类型被传递时,会调用unspecialized函数。

我的STL实现将time_t定义为long,因此myFunction(42L)调用time_t专门化。我该如何防止这种情况?

我尝试了专门化long,这会导致编译错误(正文已定义)。我也尝试了rtti,typeid(time_t).name()返回"long"

如何区分time_t和它被定义为的整数类型,和/或模板专门化time_t使得它的整数类型不会传递给专门化?

使用模板的方法更可取,但我会接受任何解决方案,运行时或编译时。

2 个答案:

答案 0 :(得分:6)

没有办法阻止这种情况。

在C ++中,typedef等同于所有目的的基本类型。在编译时,它们是等价的。在运行时,它们是等效的。

您可以完全删除time_t的定义,并将其重新定义为不同的类型,但这会破坏用户代码调用期望正确的time_t的函数的能力。

答案 1 :(得分:3)

你根本无法得到你想要的东西。 time_t被定义为(至少在C标准中)为typedef(提示是名称的“_t”部分),它不会引入新类型。你想区分某个人是否叫一个名字,但C和C ++不允许这样做。