Под правильностью я понимал случаи с полиморфными классами со сложной иерархией наследования. Насколько я понимаю, нельзя «в лоб» получить нужный тип из void * при помощи static_cast при ромбовидном наследовании. Но я не про это.
Допустим, у нас есть виртуальный метод MyClass::Foo( args... );. Соответственно при его вызове неявно первым аргументом передаётся this. Т.е. зная адрес метода в памяти и зная this этот метод можно вызвать как обычную функцию. При этом адрес метода всё равно будет равен разрядности платформы, т.е. sizeof(void*). Это верно?
Но я думаю, что мне лучше не вас в комментариях грузить, а пойти покопать информацию про способы вызова функций. Заранее спасибо.
Благодарю за ответ. Это может понадобиться, если придётся велосипедить рефлексию/интроспекцию в рамках старых стандартов. Но, как я понимаю, всё равно любой метод (виртуальный или нет) будет представлять из себя обычную «thiscall» функцию. Т.е. имея правильный указатель на класс можно всё равно запихнуть указатель на метод в void*.
Возможно я немного не в тему, но уже долгое время мучает вопрос. Вы написали, что void * по стандарту должен вмещать в себя любой указатель. Касается ли это указателей на виртуальные методы? И где вообще можно почитать про sizeof указателя на виртуальный метод?
Здравствуйте, а не могли бы вы поделиться информацией о том, как разрабатывался клиент убера под iOS/Android для стран, где произошло объединение с бизнесом Яндекса?
Какие-то задачи идут на аутсорс? А то с точки зрения юзабилити и изобилия багов — всё очень печально.
Увы, это не то. Сильно допиленный Atom. К тому же не понятно, как он будет вести себя на больших проектах. В том числе сомневаюсь, что под него появятся достойные профилировщики. CLion сильно позже стартанул и по мне так уже куда удобнее. Жаль только, что платный.
Жаль, что для C++ пока безальтернативный вариант — это QtCreator (для действительно кросс-платформенной разработки).
Из всех IDE мне больше всего нравится Visual Studio, но её так просто не портируешь, слишком много завязано на ком и винапи.
А меня Вайбер (на десктопе) ещё раздражает баннерами размером с пол списка контактов. Ну и навязыванием стикерпаков, которые нельзя удалить.
А вообще я очень боюлагодарен Вайберу за то, что меня там хорошенько дрюкнули на собеседовании в начале 2013 по Qt. С тех пор я начал уделять намного больше внимания качеству самообразования в программировании и поучаствовал во многих интересных проектах, включая wot blitz :)
Да, труд действительно значительный. Помню, когда движок dava переводили на data-drived подход тоже было очень много изменений, хотя визуально в игре ничего не поменялось. И, наверное, это был самый большой и сложный code-review на моей памяти, который делали всей командой (сам я в задаче по рефакторингу не участвовал, занимался тогда другими вещами).
Как выше написали — действительно претензия к корявому переводу :)
Занимаюсь спортивными бальными танцами. Плюсы: хорошо развивается выносливость и координация. Поддерживается в тонусе всё тело (правда руки стоит тренировать дополнительно). Развивается коммуникабельность и расширяется круг общения. Это действительно красиво.
Минусы: чем выше уровень мастерства, тем больше времени нужно тратить на тренировки. За несколько лет можно придти к ситуации, когда будет просто не хватать времени на личную жизнь (работа + тренировки будут занимать все будете дни и частично выходные). Дорого (костюмы, занятия, участие в соревнованиях). Нужна хорошая самодисциплина — тренер не будет вас заставлять, если вы сами не хотите заниматься.
Если «так должно работать», то зачем вам шаблоны? Пишите явную имплементацию для типа int. Если же делаете шаблонную функцию, то делайте так, чтобы она работала с любыми типами.
Проверка (раскомментируйте код, чтобы заработало как надо)
#include <iostream>
#include <string>
#include <sstream>
template<typename T>
T from_string(const std::string &str)
{
std::stringstream ss(str);
T t;
ss >> t;
return t;
}
/*
template<>
std::string from_string(const std::string &str)
{
return str;
}
*/
int main()
{
auto x = from_string<std::string>("1 2");
std::cout << x; // Вывод "1" вместо "1 2"
return 0;
}
У вас незначительная логическая ошибка в функции from_string. Для неё стоит сделать явную специализацию для типа std::string. Код, который не будет работать:
auto x = from_string("1 2"); // x == "1";
void *при помощиstatic_castпри ромбовидном наследовании. Но я не про это.Допустим, у нас есть виртуальный метод
MyClass::Foo( args... );. Соответственно при его вызове неявно первым аргументом передаётся this. Т.е. зная адрес метода в памяти и знаяthisэтот метод можно вызвать как обычную функцию. При этом адрес метода всё равно будет равен разрядности платформы, т.е.sizeof(void*). Это верно?Но я думаю, что мне лучше не вас в комментариях грузить, а пойти покопать информацию про способы вызова функций. Заранее спасибо.
Возможно я немного не в тему, но уже долгое время мучает вопрос. Вы написали, что void * по стандарту должен вмещать в себя любой указатель. Касается ли это указателей на виртуальные методы? И где вообще можно почитать про sizeof указателя на виртуальный метод?
Здравствуйте, а не могли бы вы поделиться информацией о том, как разрабатывался клиент убера под iOS/Android для стран, где произошло объединение с бизнесом Яндекса?
Какие-то задачи идут на аутсорс? А то с точки зрения юзабилити и изобилия багов — всё очень печально.
Жаль, что для C++ пока безальтернативный вариант — это QtCreator (для действительно кросс-платформенной разработки).
Из всех IDE мне больше всего нравится Visual Studio, но её так просто не портируешь, слишком много завязано на ком и винапи.
А меня Вайбер (на десктопе) ещё раздражает баннерами размером с пол списка контактов. Ну и навязыванием стикерпаков, которые нельзя удалить.
А вообще я очень боюлагодарен Вайберу за то, что меня там хорошенько дрюкнули на собеседовании в начале 2013 по Qt. С тех пор я начал уделять намного больше внимания качеству самообразования в программировании и поучаствовал во многих интересных проектах, включая wot blitz :)
Множественное наследование очень часто можно заменить на композицию
Как выше написали — действительно претензия к корявому переводу :)
Новая, экспериментальная, никому не известная Entity Component System. Маркетологи такие маркетологи...
Занимаюсь спортивными бальными танцами. Плюсы: хорошо развивается выносливость и координация. Поддерживается в тонусе всё тело (правда руки стоит тренировать дополнительно). Развивается коммуникабельность и расширяется круг общения. Это действительно красиво.
Минусы: чем выше уровень мастерства, тем больше времени нужно тратить на тренировки. За несколько лет можно придти к ситуации, когда будет просто не хватать времени на личную жизнь (работа + тренировки будут занимать все будете дни и частично выходные). Дорого (костюмы, занятия, участие в соревнованиях). Нужна хорошая самодисциплина — тренер не будет вас заставлять, если вы сами не хотите заниматься.
Проверка (раскомментируйте код, чтобы заработало как надо)
У вас незначительная логическая ошибка в функции from_string. Для неё стоит сделать явную специализацию для типа std::string. Код, который не будет работать:
auto x = from_string("1 2"); // x == "1";