bir dizi isteyen bir C işlevi: Bir EXTENSIONFUNCTION ve kayıtbir std proxy aracılığıyla :: işlevini Bu formun bir kanca sunan bir C sistemiyle uğraşıyorum argümanları
int (*EXTENSIONFUNCTION)(NATIVEVALUE args[]);
Mümkün aldığı argüman sayısı.
Fikrim, bir uzantıyı sarmak için bir sınıf Extension
yapmam oldu. Bir std :: function 'dan (ya da herhangi bir Callable, ideal olarak, ancak bunun için şimdi bir std :: işlevi içerdiğini varsayalım). Ve uzantı, NATIVEVALUE (ancak daha büyük)'u kapatan Değer parametrelerini alır. Örneğin, parametre sayısını sizeof...(Ts)
ile otomatik olarak halledebilirim. Bu gibi görünebilir:
Extension<lib::Integer, lib::String> foo =
[](lib::Integer i, lib::String s) -> int {
std::cout << i;
std::cout << s;
return 0;
}
Sorun kaydetmek ve çağırmak için C kütüphanesi için sırayla, o dizi tabanlı arayüz istemesi. : -/
Derleyicinin biraz shim yazmasını denemek için yola çıktım, ancak bunu yapmanın bir yolunu göremiyorum. Extension'da variadic operator()
olabilir ve bir değer [] değeri almak için NATIVEVALUE üzerinde bir çalışma zamanı döngüsü yapın. Ama ben bununla ne yapıyorum? Std :: işlevini onunla arayamıyorum.
Yani her Extension örneğinin bir üyesi olarak std :: işlevimi çağıran EXTENSIONFUNCTION örneği yapmam gerekiyor.
Ama temel olarak kendimi, bir uzantı için değişken bir templated sınıfına sahip olduğum bir duvara karşı buluyorum ... ve sonra bu NATIVEVALUE args[]
'u ele alarak, "buradan oraya gidemiyorum". std :: işlevini onlarla arayın. Std :: işlevi bir std :: argüman dizisi ile çağrılmaya istekli olsaydı, bu onu çözerdi, ama tabii ki böyle değil.
Bu tip bir çerçeve oluşturmak mümkün mü? Yapabileceğim "çirkin" bir şey gibi başka bir diziye sadece proxy'dir:
Extension<2> foo =
[](lib::Value args[]) -> int {
lib::Integer i (args[0]);
lib::String s (args[1]);
std::cout << i;
std::cout << s;
return 0;
}
Ama bu ergonomik olarak değil. Arama kuralı bilmeden ve parametrelerini işlemek için bir dizi satır içi montaj malzemesi yapmadan ve işlevini ÇAĞRIYOR (ve hatta bu işlevler için genel olarak Callables değil) çalışır.. Ama burada insanlar genellikle yoluyla, daha önce imkansız mümkün kanıtlanmıştır "diye sen aslında ne istediğini, istediğin bu değil ..."
GÜNCELLEME: Sadece hangi görünüyor buldum umut verici ... Ben hala onun alaka sindirmek için çalışıyorum:
"unpacking" a tuple to call a matching function pointer
(Not: Ben amaçladığımız şey birkaç kesişen konu vardır başka nokta lambdas çıkarımlar türüdür.. Cevap en iyisi gibi görünüyor o iş gibi görünüyor ... o bahis, ancak "koşer" ise bilmiyorum: Initialize class containing a std::function with a lambda)
'EXTENSIONFUNCTION' işlevi 'Extension' sınıfını çağırabilmek için bir 'void * userData 'almıyor gibi görünüyor, sorununuzu nasıl çözeceğinizi bilmiyorum. – Jarod42
'NATIVEVALUE' nedir? Belki dizinin ilk elemanında 'Extension' işaretçisini gösterebilirsiniz. –
Burada koyduğunuz şeyi okumakta biraz zor bir zaman geçirdim, ama * düşünüyorum * belki de onun gibi [http://ideone.com/fJlkK6]. Eğer değilse, umarım en azından size bazı fikirler verir. İyi şanslar. – WhozCraig