我正在为以这种方式声明的函数的C ++编写一个包装器:
class MyClass
{
public:
template <class T>
T& as();
};
我的包装器需要消除显式模板,因为我不想调用myClass.as<int>();
所以我尝试实现以这种方式声明的新函数:
class MyClass2 : public MyClass
{
public:
template <class T>
void get(T & val);
};
通过这种方式我可以打电话
int a;
myClass2.get(a);
有没有办法实现这个函数,所以类型是在运行时根据参数类型传递的?类似的东西:
template <class T>
void MyClass2::get(T & val)
{
val = as< typeof(val) >(); /* Of course typeof does not exist */
}
非常感谢你的帮助。
答案 0 :(得分:9)
这没有意义。为什么不写:
template <class T>
void MyClass2::get(T & val)
{
val = as< T >();
}
由于类型是模板参数,因此您不需要typeof
。
答案 1 :(得分:3)
正如@ Space_C0wb0y已经指出的那样,这实际上并不是必需的。模板类型从参数自动推断出来。
然而,C ++ 0x 确实实际上添加了你要求的东西,因为它会让你写:
template <class T>
void MyClass2::get(T & val)
{
val = as< decltype(val) >(); /* typeof does not exist. But decltype does */
}
当然,在这种情况下,它只是一种解决不存在问题的更复杂的方法。但我认为无论如何我都会展示它,因为它与您在问题中发布的伪代码非常相似。