Этот ответ является ответом на комментарий выше и не работает с VisualStudio 2008, но должен быть предпочтительнее с более поздними компиляторами.
Между тем вам больше не нужно использовать указатель void и нет необходимости в усилении, так как доступны std::bind
и std::function
. Преимущество одного (по сравнению с указателями void) - это безопасность типа, поскольку тип возврата и аргументы явно указаны с помощью std::function
:
// std::function
void Init(std::function f);
Затем вы можете создать функцию указатель с std::bind
и передать его Init:
auto cLoggersInfraInstance = CLoggersInfra();
auto callback = std::bind(&CLoggersInfra::RedundencyManagerCallBack, cLoggersInfraInstance);
Init(callback);
Полный пример для использования std::bind
с членами, статическими членами и не-членными функциями:
#include
#include
#include
class RedundencyManager // incl. Typo ;-)
{
public:
// std::function
std::string Init(std::function f)
{
return f();
}
};
class CLoggersInfra
{
private:
std::string member = "Hello from non static member callback!";
public:
static std::string RedundencyManagerCallBack()
{
return "Hello from static member callback!";
}
std::string NonStaticRedundencyManagerCallBack()
{
return member;
}
};
std::string NonMemberCallBack()
{
return "Hello from non member function!";
}
int main()
{
auto instance = RedundencyManager();
auto callback1 = std::bind(&NonMemberCallBack);
std::cout << instance.Init(callback1) << "\n";
// Similar to non member function.
auto callback2 = std::bind(&CLoggersInfra::RedundencyManagerCallBack);
std::cout << instance.Init(callback2) << "\n";
// Class instance is passed to std::bind as second argument.
// (heed that I call the constructor of CLoggersInfra)
auto callback3 = std::bind(&CLoggersInfra::NonStaticRedundencyManagerCallBack,
CLoggersInfra());
std::cout << instance.Init(callback3) << "\n";
}
Возможный выход:
Hello from non member function!
Hello from static member callback!
Hello from non static member callback!
Кроме того, используя std::placeholders
, вы можете динамически передавать аргументы для обратного вызова (например, это позволяет использовать return f("MyString");
в Init
, если f имеет строковый параметр).
Я использовал dhtmlxGrid в прошлом. Среди прочего это поддерживает строки/столбцы перетаскивания, клиентская сортировка (строка, целое число, дата, пользовательская) и мультиподдержка браузера.
Ответ на комментарий: Нет, не найденный чем-либо лучше - просто шел дальше из того проекта.:-)
Я использовал jQuery поддающийся сортировке плагин UI с хорошими результатами. Разметка, подобная этому:
<table id="myTable">
<thead>
<tr><th>ID</th><th>Name</th><th>Details</th></tr>
</thead>
<tbody class="sort">
<tr id="1"><td>1</td><td>Name1</td><td>Details1</td></tr>
<tr id="2"><td>2</td><td>Name1</td><td>Details2</td></tr>
<tr id="3"><td>3</td><td>Name1</td><td>Details3</td></tr>
<tr id="4"><td>4</td><td>Name1</td><td>Details4</td></tr>
</tbody>
</table>
и затем в JavaScript
$('.sort').sortable({
cursor: 'move',
axis: 'y',
update: function(e, ui) {
href = '/myReorderFunctionURL/';
$(this).sortable("refresh");
sorted = $(this).sortable("serialize", 'id');
$.ajax({
type: 'POST',
url: href,
data: sorted,
success: function(msg) {
//do something with the sorted data
}
});
}
});
Это ОТПРАВЛЯЕТ сериализированную версию идентификаторов объектов к данному URL. Эта функция (PHP в моем случае) затем обновляет заказы объектов в базе данных.
Я рекомендую Sortables в jQuery. Можно использовать его на элементах списка или в значительной степени чем-либо, включая таблицы.
jQuery является очень дружественным перекрестным браузером, и я рекомендую всему этому время.
Ответ David Heggie был самым полезным для меня. Это может быть немного более кратко:
var sort = function(event, ui) {
var url = "/myReorderFunctionURL/" + $(this).sortable('serialize');
$.post(url, null,null,"script"); // sortable("refresh") is automatic
}
$(".sort").sortable({
cursor: 'move',
axis: 'y',
stop: sort
});
работы для меня, с той же разметкой.
Большинство платформ (Yui, MooTools, jQuery, Prototype/Scriptaculous, и т.д.) имеет поддающуюся сортировке функциональность списка. Проведите немного исследования в каждого и выберите того, который удовлетворяет Вашим потребностям больше всего.
Как насчет поддающегося сортировке? Это, казалось бы, соответствовало бы Вашим требованиям приятно.
Это довольно просто в использовании - загружают поддающийся сортировке файл JavaScript, затем, для каждой таблицы, которую Вы хотите, чтобы это сделало поддающимся сортировке, применило класс = "поддающийся сортировке" к <таблица> тег.
Это сразу поймет, как отсортировать большинство типов данных, но если существует что-то, что это не делает, можно добавить пользовательский ключ сортировки для сообщения этого, как отсортировать. Документация объясняет все это вполне прилично.
Если Вы не возражаете против Java, существует очень удобная библиотека для GWT под названием выезд GWT-DND демонстрация онлайн, чтобы видеть, насколько мощный это.