gpt4 book ai didi

c++ - 如何使用静态多态在int和指针类型之间转换?

转载 作者:行者123 更新时间:2023-12-01 14:43:43 24 4
gpt4 key购买 nike

我有这段代码:

#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()时崩溃,但是我不确定为什么。我正在使用仅符合C++ 14的GCC 6.2.0,否则我将使用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); }

( live demo)

当程序“崩溃”时,您应该在调试器中运行它。您会非常清楚地看到堆栈溢出,因为数百个堆栈帧都将显示相同的递归调用。

关于c++ - 如何使用静态多态在int和指针类型之间转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59595897/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com