Son zamanlarda libffi ile çalışıyorum ve bir C API kullandığından, herhangi bir soyutlama void işaretçiler (iyi ol 'C) kullanılarak yapılır. Bu API'yi kullanan bir sınıf (variadic şablonlarla) oluşturuyorum. sınıf bildirimi aşağıdadır: (burada Ret
= dönüş değeri ve Args
= fonksiyon argümanlar) Bu sınıf içindeVariadic şablonları: type/template argümanı üzerinde yineleme
template <typename Ret, typename... Args>
class Function
I (basitleştirilmiş), iki farklı işlevleri de ilan var: istediğim
Ret Call(Args... args); // Calls the wrapped function
void CallbackBind(Ret * ret, void * args[]); // The libffi callback function (it's actually static...)
Call
'u CallbackBind
'dan kullanabilmek; ve bu benim problemim. void*
dizisini şablonlanmış argüman listesine nasıl dönüştüreceğimi bilmiyorum. Bu ulaşılabilir değilse herhangi geçici çözümler veya farklı çözüm mevcuttur,
CallbackBind(Ret * ret, void * args[])
{
// I want to somehow expand the array of void pointers and convert each
// one of them to the corresponding template type/argument. The length
// of the 'void*' vector equals sizeof...(Args) (variadic template argument count)
// Cast each of one of the pointers to their original type
*ret = Call(*((typeof(Args[0])*) args[0]), *((typeof(Args[1])*) args[1]), ... /* and so on */);
}
: Bu benim az ya da çok istediğin bu mu?
Kitaplığın doğrudan API'sini arayabilmeniz için bir neden var mı? Zaten bir * void * var ve zaten bunu bekliyor. –
Mmm neden değişken bir argüman ile değişken bir şablon işlevini çağırmak istersiniz? "Args uzunluğunun büyüklüğü eşittir ... (Args)" gerçeğine dayanarak, gerekli argüman sayısını biliyorsunuz, neden variadic şablonlarını kullanıyorsunuz? – mfontanini
@MarkB 'CallbackBind' den beri _from_ kütüphanenin API'sı void işaretçileri kullanmayan kendi işlevimi çağırmaya çalışıyorum. @mfontanini std :: function' kelimesini taklit eden bir sınıf istiyorum ve bu yüzden de variadic şablonlara ihtiyacım var (örneğin, operator() (Args ...) ') –