我需要知道内置函数或者无论如何都要在C ++中获取变量的类型
我想检查泛型方法中变量的类型。
for INSTANCE
template<class Numbers> bool Matrix(Numbers matrix[] ,int matrixsize)
{
if (/* type of matrix is int */)
return false;
else
return true;
}
答案 0 :(得分:4)
您在评论中所做的更好的方法是使用模板专业化:
template<class Numbers>
bool Matrix(Numbers matrix[] ,int matrixsize) {
return true;
}
template<> // full specialziation on int
bool Matrix(int matrix[] ,int matrixsize) {
return false;
}
这将在编译时分支使用哪个模板:第一个(通用)或第二个(专用)。如果需要,您还可以拥有多个专业化
如果有想要根据 dynamic 类型进行分支的地方(例如,指向基类的指针是否实际上指向其衍生物之一的基类),您应该能够使用在大多数情况下dynamic_cast<>
:
class Base {
public: virtual ~Base();
};
class Derived : public Base {
public: void mySpecialMethod();
};
void f(Base* b) {
Derived* d = dynamic_cast<Derived*> (b);
if (d != NULL) {
// *b's actual type is (derivative of) Derived
d->mySpecialMethod();
}
}
请注意,最好的方法是进行正确的继承:
class Base {
public:
virtual Base();
virtual void myMethod();
};
class Derived : public Base {
public: void myMethod();
};
void f(Base* b) {
b->myMethod();
}
如果*b
的实际类型为Derived
,则调用Derived :: myMethod();如果*b
的实际类型为Base
,则调用Base :: myMethod();如果在myMethod
对象上调用Base
是没有意义的(但是对于它的所有派生类都是如此),你可以通过在=0
中将Base
添加到其中来实现纯虚拟虚拟。 {1}}。或者只是定义一个空体(如果需要返回一个值,可能效果不好)
答案 1 :(得分:2)
就我的解密技巧而言,评论使问题更加明确。你想要的是模板专业化。
template<class Numbers>
bool Matrix(Numbers matrix[] ,int matrixsize) {
return true;
}
template<>
bool Matrix(int matrix[] ,int matrixsize) {
return false;
}
如果你想在编译时这样做,在C ++ 11中你可以使用decltype
来获取任何表达式的类型:
int my_variable;
decltype(my_variable) other_variable; // has type int
我不知道在C ++ 03中如何(轻松)这样做。
如果要在运行时获取对象的类型(有时在处理多态时很有用),可以使用typeid()
运算符和std::type_info
。
#include <type_info>
// ...
void foo(some_virtual_class& base) {
const std::type_info& info = typeid(base);
// Do something with the type info.
}
答案 2 :(得分:1)
在C ++中,对类型的操纵属于“元编程”的总称,你描述的功能将是“元函数”。
新标准定义了各种元函数,包括剥离数组边界的元函数和检查类型等价的元函数。
此表达式求值为常量true
:
std::is_same< typename std::remove_extent< int[] >::type, int >::value
使用C ++ 11,您可以将其与#include <type_traits>
一起使用。对于较旧的编译器,您可以通过#include <tr1/type_traits>
或#include <type_traits>
访问它,然后使用std::tr1::is_same
和std::tr1::remove_extent
。
如果你想封装表达式而不是每次都写出来(因为它相当难看),定义你自己的元函数很简单:
template< typename T >
struct array_is_int {
enum { value =
std::is_same< typename std::remove_extent< int[] >::type,
int >::value
};
};
如果稍后您还要为true
返回unsigned int
,只需修改表达式:
template< typename T >
struct array_is_int {
enum { value =
std::is_same< typename std::remove_extent< int[] >::type,
int >::value
|| std::is_same< typename std::remove_extent< int[] >::type,
unsigned int >::value
};
};
这比处理依赖于函数重载规则的特化更容易。