Todos os idiomas não devem tentar incorporar todos os recursos de qualquer outro idioma.
C ++ é essencialmente um montador de macros muito, muito sofisticado. NÃO é (no sentido tradicional) uma linguagem de alto nível como C #, Java, Objective-C, Smalltalk, etc.
É bom ter ferramentas diferentes para trabalhos diferentes. Se tivermos apenas martelos, tudo parecerá prego, etc. Ter linguagens de script é útil para alguns trabalhos, e linguagens OO reflexivas (Java, Obj-C, C #) são úteis para outra classe de trabalhos, e super linguagens básicas simples e próximas da máquina são úteis para mais uma classe de tarefas (C ++, C, Assembler).
O C ++ faz um trabalho incrível de estender a tecnologia Assembler para níveis incríveis de gerenciamento de complexidade e abstrações para tornar a programação tarefas maiores e mais complexas muito mais possíveis para os seres humanos. Mas não é necessariamente uma linguagem mais adequada para aqueles que estão abordando o problema de uma perspectiva estritamente de alto nível (Lisp, Smalltalk, Java, C #). Se você precisar de um idioma com esses recursos para implementar melhor uma solução para seus problemas, agradeça àqueles que criaram esses idiomas para que todos nós possamos usar!
Mas C ++ é para aqueles que, por qualquer motivo, precisam ter uma forte correlação entre seu código e a operação da máquina subjacente. Seja sua eficiência, drivers de dispositivo de programação ou interação com os serviços de SO de nível inferior ou qualquer outra coisa, o C ++ é mais adequado para essas tarefas.
C #, Java, Objective-C exigem um sistema de tempo de execução muito maior e mais rico para suportar sua execução. Esse tempo de execução deve ser entregue ao sistema em questão - pré-instalado para suportar a operação do seu software. E essa camada deve ser mantida para vários sistemas de destino, personalizados por ALGUM OUTRO IDIOMA para fazê-lo funcionar nessa plataforma. E essa camada intermediária - aquela camada adaptativa entre o sistema operacional host e o seu código - o tempo de execução, é quase sempre escrita em uma linguagem como C ou C ++, onde a eficiência é a número 1, na qual é possível entender previsivelmente a interação exata entre software e hardware. entendido e manipulado para obter o ganho máximo.
Eu amo Smalltalk, Objective-C, e ter um sistema de tempo de execução rico com reflexão, metadados, coleta de lixo, etc. É possível escrever um código incrível para aproveitar essas facilidades! Mas isso é simplesmente uma camada mais alta na pilha, uma camada que deve repousar nas camadas inferiores, e que, por fim, elas devem estar no SO e no hardware. E sempre precisaremos de uma linguagem mais adequada para criar essa camada: C ++ / C / Assembler.
Adendo: o C ++ 11/14 continua expandindo a capacidade do C ++ para oferecer suporte a abstrações e sistemas de nível superior. Threading, sincronização, modelos de memória precisos, definições de máquina abstrata mais precisas estão permitindo que os desenvolvedores de C ++ obtenham muitas das abstrações de alto nível que algumas dessas linguagens de alto nível costumavam ter domínio exclusivo, enquanto continuam fornecendo informações próximas a desempenho metálico e excelente previsibilidade (ou seja, subsistemas de tempo de execução mínimo). Talvez os recursos de reflexão sejam seletivamente ativados em uma revisão futura do C ++, para aqueles que o desejam - ou talvez uma biblioteca forneça esses serviços de tempo de execução (talvez exista um agora ou o início de um impulso).