C++:如何获取变量的类型并将其用作模板

yel*_*lo3 3 c++ templates types

我正在为以这种方式声明的函数的C++编写一个包装器:

class MyClass
{
public:
  template <class T>
  T& as();
};
Run Code Online (Sandbox Code Playgroud)

我的包装器需要消除显式模板,因为我不想调用 myClass.as<int>();

所以我尝试实现以这种方式声明的新函数:

class MyClass2 : public MyClass
{
public:
  template <class T>
  void get(T & val);
};
Run Code Online (Sandbox Code Playgroud)

通过这种方式我可以打电话

int a;
myClass2.get(a);
Run Code Online (Sandbox Code Playgroud)

有没有办法实现这个函数,所以类型是在运行时根据参数类型传递的?就像是:

template <class T>
void MyClass2::get(T & val)
{
  val = as< typeof(val) >();  /* Of course typeof does not exist */
}
Run Code Online (Sandbox Code Playgroud)

非常感谢您的帮助.

Bjö*_*lex 9

这根本不符合逻辑.为什么不写:

template <class T>
void MyClass2::get(T & val)
{
  val = as< T >();
}
Run Code Online (Sandbox Code Playgroud)

由于类型是模板参数,因此您不需要typeof.


jal*_*alf 6

正如@Space_C0wb0y 已经指出的那样,这实际上是没有必要的。模板类型是根据参数自动推断的。

然而,C++0x实际上添加了您所要求的内容,因为它可以让您编写:

template <class T>
void MyClass2::get(T & val)
{
  val = as< decltype(val) >();  /* typeof does not exist. But decltype does */
}
Run Code Online (Sandbox Code Playgroud)

当然,在这种情况下,这只是解决不存在问题的更复杂的方法。但我想无论如何我都会演示它,因为它与您在问题中发布的伪代码非常相似。