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() 的主体的答案感兴趣,以便此代码编译时不会出错。例如,我意识到可以在这里使用模板专业化,但这不符合问题的标准。谢谢!
解决方案
使用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);
}
推荐阅读
- python - 如何导入另一个目录中的文件?
- python - 如何在 Python 中获取 gcloud 访问令牌?
- sql - 查询“PIVOT”特定年份的 SalesAmount 和 CumulativeMonthly 的结果
- powershell - PowerShell - 如何使用 ADSI 和备用凭据将用户添加到 AD 用户组
- javascript - 如何从 HTML 中的下拉菜单中获取值以在我的 Flask 应用程序中使用?
- iframe-resizer - Privacy Badger 扩展使用 iframe-resizer 阻止 iframe 内容
- docker - Kibana 无法恢复与 ElasticSearch 的连接
- python - 使用 Scrapy 和 Selenium 抓取搜索结果
- sdl - SDL_RenderClear 有什么作用?
- org-mode - 如何从 src 块中的多个表中访问数据