สมมติว่าฉันมีที่อยู่หน่วยความจำรันไทม์ของฟังก์ชันในแอปพลิเคชัน และฉันรู้ประเภทการส่งคืนของฟังก์ชันดังกล่าว เป็นไปได้หรือไม่ที่จะเรียกใช้ฟังก์ชันนี้ โดยทราบประเภทการส่งคืนฟังก์ชัน อาร์กิวเมนต์ และรูปแบบการเรียก โดยใช้เทมเพลต variadic
ฟังก์ชันเทมเพลตต้องรองรับประเภทการส่งคืนทั้งแบบเป็นโมฆะและไม่เป็นโมฆะ เนื่องจากเรากำลังจัดการกับพอยน์เตอร์ของฟังก์ชัน คอมไพลเลอร์จึงไม่ควรบ่น แม้จะส่งคืน ptr ก็ตาม
ฉันคิดที่จะทำสิ่งนี้:
template<typename ReturnType, typename Address, typename... Args>
ReturnType function_caller(Address address, Args... args)
{
ReturnType(*ptr)(Args...) = address;
return ptr(args...);
}
int main()
{
auto address = 0x100;
auto address2 = 0x200;
function_caller<void>(&address, 1, 1); // Function with return type void.
int result = function_caller<int>(&address2, 1, 2, 3.f, "hello");
// result should contain the int value we received by calling the function at 0x200
}
น่าเสียดายที่คอมไพเลอร์แสดงข้อผิดพลาด C2440: ไม่สามารถแปลงที่อยู่ address
เป็น 'ReturnType (__cdecl *)(int,int)
'
ฉันขอขอบคุณสำหรับความช่วยเหลือของคุณเกี่ยวกับปัญหานี้ ฉันรู้ว่าฉันสามารถแบ่ง wrapper นี้ออกเป็น 2 ฟังก์ชันได้: ฟังก์ชันหนึ่งสำหรับการโทรที่เป็นโมฆะ และอีกฟังก์ชันสำหรับการโทรที่ไม่เป็นโมฆะ แต่ฉันหวังว่าจะมีโซลูชันที่รองรับเทมเพลตที่หรูหรากว่านี้
ขอบคุณและขอให้เป็นวันที่ดี!
const char*
หรือเป็นconst char[6]
ฉันค่อนข้างแน่ใจว่ามันเป็นอย่างหลัง - person Mooing Duck   schedule 25.08.2020