Самое простое решение - создать функцию JavaScript и вызвать его для обратного вызова Ajax success
.
function callServerAsync(){
$.ajax({
url: '...',
success: function(response) {
successCallback(response);
}
});
}
function successCallback(responseObj){
// Do something like read the response and show data
alert(JSON.stringify(responseObj)); // Only applicable to JSON response
}
function foo(callback) {
$.ajax({
url: '...',
success: function(response) {
return callback(null, response);
}
});
}
var result = foo(function(err, result){
if (!err)
console.log(result);
});
Поскольку объект Derived*
не является объектом Base*
, и вполне возможно, что у двух могут быть разные макеты памяти или представления значений (если требования выравнивания Base
и Derived
отличаются, например). Поскольку один из них не является другим, static_cast
бессилен выполнять преобразование.
Если вы знаете, что делаете, и знаете, что тип каламбур в порядке, используйте инструмент для типа punning & mdash; reinterpret_cast
:
reinterpret_cast<Base*&>(derived);
И помните о любых последствиях неправильного использования (как всегда идет reinterpret_cast
). Обратите внимание, в частности, что на C ++ 11 3.10 / 10 любой доступ через результат приведения будет неопределенным поведением в отношении стандарта (хотя ваш компилятор может дать более надежные гарантии).
Обратите внимание, что в общем случае приведение от Derived*
до Base*
не обязательно должно быть no-op. Например, он может включать сдвиг адреса, если задействовано несколько наследований.
Для вашей ошибки измените это значение
static_cast<Base*&>(derived);
to
static_cast<Base*>(derived);
^^
См. здесь http://ideone.com/1QuMLK
В соответствии с вашим комментарием:
«Нет, это не академический вопрос. Мне нужно вызвать функцию, принимающую в качестве аргумента Base*&
»
Правильный способ решения это создать новую переменную указателя соответствующего типа и передать ее (или, вернее, ссылку на нее) соответствующей функции:
struct Base { };
struct Derived : Base { };
int main()
{
Derived* derived = nullptr;
Base* base = static_cast<Base*>(derived);
my_function(base); // takes a Base*& argument
// If you need the pointer value and are sure that
// it's a Derived* type:
derived = static_cast<Derived*>(base);
}
Обратите внимание, что вы, скорее всего, получили этот ответ скорее, если бы вы включили соответствующую информацию (из комментария, приведенного выше) в самом вопросе.
, если вам нужна ссылка, которую вы должны сделать
Base* ptr = static_cast<Base*>(derived);
Base &ref = *ptr;
, вы не можете наложить указатель на ссылку - это совсем другие вещи