在c++中,如何找到变量的类型?
当前回答
如果你需要在一个类和一个已知类型之间进行比较,例如:
class Example{};
...
Example eg = Example();
你可以使用这条比较线:
bool isType = string( typeid(eg).name() ).find("Example") != string::npos;
它检查typeid名称是否包含字符串类型(typeid名称有其他损坏的数据,因此最好执行s1.find(s2)而不是==)。
其他回答
带有abi::__cxa_demangle()的typeid操作符(仅GCC / Clang)
#include <iostream>
#include <typeinfo>
#if defined __GNUC__
#include <cxxabi.h> // GCC / Clang only
#endif
int main() {
long long w;
std::cout << typeid(w).name() << std::endl; // x
#if defined __GNUC__ // GCC / Clang only
char * name = abi::__cxa_demangle(typeid(w).name(), 0, 0, 0);
std::cout << name << std::endl; // long long
free(name);
#endif
}
叮当在线
你可以使用typeid操作符:
#include <typeinfo>
...
cout << typeid(variable).name() << endl;
我不确定我的回答是否有用。
简单的回答是,你不需要/不想知道变量的类型来使用它。
如果你需要给一个静态变量一个类型,那么你可以简单地使用auto。
在更复杂的情况下,你想在类或结构中使用“auto”,我建议使用template with decltype。
例如,假设你正在使用别人的库,它有一个名为“unknown_var”的变量,你想把它放在一个向量或结构中,你完全可以这样做:
template <typename T>
struct my_struct {
int some_field;
T my_data;
};
vector<decltype(unknown_var)> complex_vector;
vector<my_struct<decltype(unknown_var)> > simple_vector
希望这能有所帮助。
编辑:为了更好地衡量,这里是我能想到的最复杂的情况:有一个未知类型的全局变量。在这种情况下,您将需要c++14和模板变量。
就像这样:
template<typename T> vector<T> global_var;
void random_func (auto unknown_var) {
global_var<decltype(unknown_var)>.push_back(unknown_var);
}
它仍然有点乏味,但它是最接近无类型语言的。只要确保当你引用模板变量时,总是把模板规范放在那里。
如果你需要在一个类和一个已知类型之间进行比较,例如:
class Example{};
...
Example eg = Example();
你可以使用这条比较线:
bool isType = string( typeid(eg).name() ).find("Example") != string::npos;
它检查typeid名称是否包含字符串类型(typeid名称有其他损坏的数据,因此最好执行s1.find(s2)而不是==)。
如果你有一个变量
int k;
你可以使用它来获取它的类型
cout << typeid(k).name() << endl;
请看下面关于SO的帖子:类似的问题