如何确定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使得它的整数类型不会传递给专门化?
使用模板的方法更可取,但我会接受任何解决方案,运行时或编译时。
答案 0 :(得分:6)
没有办法阻止这种情况。
在C ++中,typedef
等同于所有目的的基本类型。在编译时,它们是等价的。在运行时,它们是等效的。
您可以完全删除time_t
的定义,并将其重新定义为不同的类型,但这会破坏用户代码调用期望正确的time_t
的函数的能力。
答案 1 :(得分:3)
你根本无法得到你想要的东西。 time_t
被定义为(至少在C标准中)为typedef
(提示是名称的“_t
”部分),它不会引入新类型。你想区分某个人是否叫一个名字,但C和C ++不允许这样做。