如何在c ++中确定arg类型

时间:2016-01-20 04:58:40

标签: c++ c googletest

在gcc中,我可以使用以下代码:

#define is_t(smth, type) ({int is_t_result; if (__builtin_types_compatible_p(__typeof__(smth), type)) {is_t_result = 1;}; is_t_result;})

但是当我在googletest(c ++)中运行它时,会引发

error: expected primary-expression before ‘__typeof__’

是否可以在cpp中实现is_t

1 个答案:

答案 0 :(得分:1)

这是一个非常复杂的问题,因为有许多不同的方法可以“检测类型”,具体取决于您要完成的任务。基本上有两种不同类型的“类型检查”:编译时和运行时。在编译时检查方面,将“duck-typing”与C ++模板一起使用是很常见的(如果满足隐式要求,它就可以工作);但是,在某些情况下,这还不够,<type_traits>static_assert提供了更明确地强制执行要求的方法,而decltype允许人们引用将返回的类型一种表达。运行时的类型转换在C ++中不太常见(通常通过“动态调度”,a.k.a。虚函数隐式完成);但是,在显式检查对象的运行时类型方面,有dynamic_cast<T>机制。

但是,很长一段时间,你的is_t()宏可能最好用C ++中内置的类型检测机制取而代之。如果您使用的是旧版本的C ++,Boost提供了广泛兼容的等价物,可用于许多C ++编译器以及C ++ 98和C ++ 11。这样做会使你更清楚你所说的变量是什么意思。 (例如,它被声明为完全属于那种类型,它是否具有该运行时类型,它是否被声明为可分配给另一种类型的类型)。