如何使用静态多态性在 int 和指针类型之间进行转换?
How can I use static polymorphism to convert between int and pointer types?
我有这段代码:
#include <iostream>
template<class T> void* ToPtr(T t) { return ToPtr((void*)t); }
void* ToPtr(void* i) { return i; }
void* ToPtr(int i) { return (void*)(long)(unsigned int)i; }
template<class T> int ToInt(T t) { return ToInt((void*)t); }
int ToInt(void* i) { return (int)(unsigned int)(long)i; }
int ToInt(int i) { return i; }
struct MyClass {
template<class T>
void* Find(T t) { return ToPtr(t); }
template<class T>
int FindInt(T t) { return ToInt(t); }
};
int main() {
MyClass myClass;
int myInt = 1;
std::cout << &myClass << std::endl;
std::cout << myInt << std::endl;
std::cout << myClass.Find(&myClass) << std::endl;
std::cout << myClass.Find(myInt) << std::endl;
std::cout << myClass.FindInt(&myClass) << std::endl;
std::cout << myClass.FindInt(myInt) << std::endl;
}
该程序在第一次调用 Find(( 时崩溃,但我不确定为什么。我使用的是GCC 6.2.0,它仅符合C++14标准,否则我会使用constexpr。我做错了什么?
template<class T> void* ToPtr(T t) { return ToPtr((void*)t); }
这叫自己。永远。
由于非模板优先于模板,因此这很容易解决:您只需将非模板放在首位,以便它们在上述重载范围内:
void* ToPtr(void* i) { return i; }
void* ToPtr(int i) { return (void*)(long)(unsigned int)i; }
template<class T> void* ToPtr(T t) { return ToPtr((void*)t); }
int ToInt(void* i) { return (int)(unsigned int)(long)i; }
int ToInt(int i) { return i; }
template<class T> int ToInt(T t) { return ToInt((void*)t); }
(现场演示(
当您的程序"崩溃"时,您应该在调试器中运行它。你会非常清楚地看到堆栈溢出,因为数百个堆栈帧都会显示相同的递归调用。
此函数
template<class T> void* ToPtr(T t) { return ToPtr((void*)t); }
无限期地称自己为...
ToPtr
不是此函数模板中的依赖名称(因为强制转换为void*
从来都不是依赖于类型的表达式 [temp.dep.expr]/3(,因此,它是在函数模板的定义点而不是实例化点查找的。由于在定义点没有声明其他ToPtr
重载,因此函数模板最终会调用自身。确保在定义函数模板之前声明ToPtr
的所有重载...
除此之外,您实际上永远不应该将指针转换为unsigned int
或int
因为这些类型不能保证足够大以实际表示指针值。使用 std::uintptr_t 或 std::intptr_t 如果你真的必须这样做......
相关文章:
- C++LinkedList问题.数据类型之间存在冲突?没有匹配的构造函数
- 在类型和包装器之间reinterpret_cast是否安全<Type>?
- 为什么 c++(g++) 不允许模板返回类型和函数名称之间有空格?
- C ++中无符号位长度类型之间的隐式转换,即uint8_t,uint16_t
- 为什么不同类型层次结构的指针之间的dynamic_cast定义得很好?
- 非类类型表达式的静态类型与动态类型之间的差异
- 如何使用静态多态性在 int 和指针类型之间进行转换?
- 指向 POD 类型的指针之间的静态转换与重新解释转换
- 在 Rcpp 中的字符串类型之间转换时出错
- 如何在不同类型的值之间进行选择以传递给多态函数?
- 如何声明不同类型的模板化类之间的转换
- 在硬件SIMD矢量指针和相应类型之间进行"interpret_cast"是一种未定义的行为吗
- "+=" 操作在类型之间不起作用 std::复杂<double>和__complex__双精度
- 无符号长整型和无符号 int 之间有什么区别,这 2 种类型应该如何在 c# 中封送?
- 不同c++编译器之间的自动类型推导不匹配
- 类型测试对象的动态数组的这两个声明之间的区别?
- 使用模板在size_t和int之间进行隐式类型转换
- 为什么C++中的表达式类型在不同版本之间会发生变化
- 您可以在具有相同表示形式的类型之间reinterpret_cast吗?
- C和c++之间类型转换的差异