我的小组维护一些旧式容器类,该类既存储指针又存储32位整数。编写它们时,指针是32位的,但现在是64位的。每个函数都有两个版本,一个用于指针,一个用于整数,我正在尝试使用模板将其合并为一个函数。我该如何做并使编译器满意?问题的玩具版本如下。
void* mPtr = nullptr;
template<class T>
void Func(T t) {
mPtr = reinterpret_cast<void*>(t);
}
template<class T>
T Func2() {
if (typeid(T) == typeid(int))
return static_cast<int>(reinterpret_cast<long long>(mPtr));
else
return static_cast<T>(mPtr);
}
class MyClass {};
int main() {
MyClass someClass;
Func(&someClass);
MyClass* myClass = Func2<MyClass*>();
int val = Func2<int>();
}
请记住,这只是一个玩具问题,我只对这里的答案感兴趣,这些答案是否可以重写Func2()的主体,以便此代码可以正确编译。我意识到,例如可以在此处使用模板专业化,但这不符合问题的标准。谢谢!
答案 0 :(得分:3)
使用if constexpr
(并纠正代码中的所有错字):
template<class T>
T Func2() {
if constexpr (std::is_same_v<T, int>)
return static_cast<int>(reinterpret_cast<long long>(mPtr));
else
return static_cast<T>(mPtr);
}