首页 > 解决方案 > 如何在模板化函数中转换为两种不同的类型?

问题描述

我的团队维护一些遗留容器类,它们存储指针和 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() 的主体的答案感兴趣,以便此代码编译时不会出错。例如,我意识到可以在这里使用模板专业化,但这不符合问题的标准。谢谢!

标签: c++

解决方案


使用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);
}

另请参见"if constexpr()" 与 "if()" 之间的区别


推荐阅读