如何在 c++ 中确定参数类型

How to determine arg type in c++

本文关键字:参数 类型 c++      更新时间:2023-10-16

在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;})

但是当我在谷歌测试(C ++)中运行它时,它会引发

error: expected primary-expression before ‘__typeof__’

在CPP中实施is_t是否有其他选择?

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

长话短说,您的is_t()宏可能最好替换为 C++ 中用于类型检测的内置机制。如果您使用的是旧版本的C++,Boost 提供了广泛兼容的等效项,这些等效项适用于许多C++编译器以及 C++98 和 C++11。这样做将使你更清楚地了解该类型的变量的含义。(例如,它是否声明为完全属于该类型,它是否具有该运行时类型,是否声明为可分配给另一种类型的类型)。