Ага, а еще Лайф прикольную рекламу отгрохал на перегоне Лукьяновка - Театральная. Там такая анимация в тоннеле - птицы, животные всякие. Я когда первый раз увидел, подумал что у меня галлюцинации.
Да, mem_fun - это одна из разновидностей обобщенных функторов. Другая инкапсулирует и указательна обьект, и указатель на функцию - т.е. для вызова ей нужно только [пустой] список аргументов. Используется для реализации паттернов "command", "chain of responsibility", "broadcaster-subscriber" и многих других. Применение очень широкое.
Шаблоны в С++ - это как раз обобщенное программирование. Порождающее - это когда код порождается НА ЭТАПЕ ВЫПОЛНЕНИЯ программы, шаблоны же инстанциируются на этапе компиляции. По поводу "структурированные макросы на стероидах" даже спорить не хочу, макросы там и близко не валялись. Читаем Александреску, если интересует.
Указатель на функцию (не только функцию член, любую) туда вписывается очень даже естественно - это просто вызываемая сущность.
А зачем изучать ассемблерный код???
Простых указателей на ф-ции не хватает по одной простой прчине, потому что функция не простая, член класса. И если вы изучали ассемблерный код, то наверное заметили, что указатель на функцию-член. И вызывается она немного по другому - компилятор должен запихнуть в стек указатель this, отсюда и "семантическая сложность", в которой я не виджу ничего сложного.
в данном случае и этого не нужно, потому что тут нет привязки к динамическим объектам. Можно через функцию всё сделать
Вы все таки не поняли для чего существуют функторы. Вот вам пример
С последним абзацем частично согласен. С многопоточностью проблемы всегда были и будут. Просто нужно пользоваться библиотеками, которые предусматривают работу в многопоточной среде, ну и свое приложение проектировать исходя из этого.
Указатель на член - это инструмент обобщенного (или мета-) программирования и ООП здесь ни причем. Еще раз С++ - мультипарадигменный язык.
Ну и чего вы привязались к этому примеру со строками? Он был приведен просто для нагладности. Основное применение move семантики - передача владения (указателем, обьектом ядра, чем угодно) от временного обьекта к постоянному. А создавать подобные временные обьекты в куче, и наворачивать потом алгоритмы очистки памяти... это уже из другой оперы. С++ предназначен для решения критических задач, и здесь очень важно иметь полный контроль наж временем жизни обьекта. В С++09 сборщик мусора конечно будет, но там будет возможность решать, отдавать обьект ему на растерзание или нет.
несколько противоречивое, не находите? Сначала вопрос: зачем перегружать? А потом радость по поводу нововведений
не нахожу, потому что это действительно необходимо. Без этих елементов невозможно (или возможно, но с ограничениями) решить большой класс задач, именно потому их добавили в стандарт.
А СИ++ перегружен, вне всяких сомнений. Когда в языке есть оператор ->*, который я даже прочитать на нормальном языке не могу, а только объяснить, как он работает, то это явный перебор со сложностью, imho.
Возможно где-то и перегружен, но только ради совметимости с С. По поводу ->*, а как вы предлагаете обозаначать доступ к члену класса по указателю? По моему, вполне логичное обозначение.
Не используется - множественное наследование, например. Ну, кто-то наверняка использует, но основное применение - это интерфейсы, что явно гораздо скромнее, чем первоначальный размах задуманного.
Тут согласен. Они бы уже навреное и рады были убрать его, но совместимость....
Или вот указатели на элементы классов.
Вот тут не согласен. Самое полезное применеие - обобщенные функторы.
А жить, вобщем-то можно и без stl.
Ну это уже вопрос религии. Благо, С++ не ограничивает нас в выборе, в отличие от той же Джавы
а как он будет применяться для создания первого rvalue? При выполнении первого сложения?
Нет, первая rvalue ссылка создается вызовом конструктора. Получаем неименованый обьект, т.е. rvalue. Нет тут ничего сложного. А поиск перегруженного оператора - просто сначала ищем оперетор, который принимает rvalue в качестве аргумента, если не нашли - ищем дальше по обычным правилам.
Указатель на функцию (не только функцию член, любую) туда вписывается очень даже естественно - это просто вызываемая сущность.
std::vector *A в угловых скобочках )))* v ;
std::vector v;
Простых указателей на ф-ции не хватает по одной простой прчине, потому что функция не простая, член класса. И если вы изучали ассемблерный код, то наверное заметили, что указатель на функцию-член. И вызывается она немного по другому - компилятор должен запихнуть в стек указатель this, отсюда и "семантическая сложность", в которой я не виджу ничего сложного.
Вы все таки не поняли для чего существуют функторы. Вот вам пример
class A
{
public:
void f () {}
};
void f (A* a)
{
a->f ();
}
void main ()
{
std::vector v;
std::for_each (v.begin (), v.end (), f);
std::for_each (v.begin (), v.end (), mem_fun(&A::f));
}
Другого способа обобщить такой вызов нет. Приведите пожалуйста "метод получше" из другого языка
Ну и чего вы привязались к этому примеру со строками? Он был приведен просто для нагладности. Основное применение move семантики - передача владения (указателем, обьектом ядра, чем угодно) от временного обьекта к постоянному. А создавать подобные временные обьекты в куче, и наворачивать потом алгоритмы очистки памяти... это уже из другой оперы. С++ предназначен для решения критических задач, и здесь очень важно иметь полный контроль наж временем жизни обьекта. В С++09 сборщик мусора конечно будет, но там будет возможность решать, отдавать обьект ему на растерзание или нет.
не нахожу, потому что это действительно необходимо. Без этих елементов невозможно (или возможно, но с ограничениями) решить большой класс задач, именно потому их добавили в стандарт.
Возможно где-то и перегружен, но только ради совметимости с С. По поводу ->*, а как вы предлагаете обозаначать доступ к члену класса по указателю? По моему, вполне логичное обозначение.
Вот тут не согласен. Самое полезное применеие - обобщенные функторы.
Ну это уже вопрос религии. Благо, С++ не ограничивает нас в выборе, в отличие от той же Джавы
Нет, первая rvalue ссылка создается вызовом конструктора. Получаем неименованый обьект, т.е. rvalue. Нет тут ничего сложного. А поиск перегруженного оператора - просто сначала ищем оперетор, который принимает rvalue в качестве аргумента, если не нашли - ищем дальше по обычным правилам.