如何在C ++中获取typeof变量

时间:2012-04-15 10:15:45

标签: c++ typeof

我需要知道内置函数或者无论如何都要在C ++中获取变量的类型

我想检查泛型方法中变量的类型。

for INSTANCE

template<class Numbers> bool Matrix(Numbers matrix[] ,int matrixsize)
{
 if (/* type of matrix is int */)
   return false;
 else
   return true;
} 

3 个答案:

答案 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_samestd::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
    };
};

这比处理依赖于函数重载规则的特化更容易。