Dengan asumsi saya memiliki alamat memori runtime suatu fungsi dalam Aplikasi dan saya mengetahui tipe kembalian dari fungsi tersebut, apakah mungkin untuk memanggil fungsi tersebut, mengetahui tipe kembalian fungsi, argumennya dan konvensi pemanggilannya, menggunakan templat variadik?
Fungsi templat harus mendukung tipe pengembalian void dan non-void. Karena kenyataan bahwa kita berurusan dengan penunjuk fungsi, kompiler tidak boleh mengeluh, meskipun mengembalikan ptr.
Saya berpikir untuk melakukan sesuatu seperti ini:
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
}
Sayangnya kompiler memunculkan kesalahan C2440: Tidak dapat mengubah Alamat address
menjadi 'ReturnType (__cdecl *)(int,int)
'
Saya akan sangat menghargai bantuan Anda dalam masalah ini. Saya tahu saya bisa membagi pembungkus ini menjadi 2 fungsi: satu untuk panggilan batal dan satu lagi untuk panggilan non-void, tapi saya berharap ada solusi yang lebih elegan dan didukung template.
Terima kasih dan semoga harimu menyenangkan!
const char*
atauconst char[6]
? Saya cukup yakin itu yang terakhir. - person Mooing Duck   schedule 25.08.2020