如何在模板化函数中转换为两种不同类型?

时间:2019-10-01 17:03:58

标签: c++

我的小组维护一些旧式容器类,该类既存储指针又存储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()的主体,以便此代码可以正确编译。我意识到,例如可以在此处使用模板专业化,但这不符合问题的标准。谢谢!

1 个答案:

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

另请参阅Difference between "if constexpr()" Vs "if()"