O C ++ 0x adiciona um suporte bastante abrangente a inferência de tipos. Estou extremamente tentado a usá-lo em todos os lugares possíveis para evitar repetições indevidas, mas estou me perguntando se a remoção de informações explícitas de tipo em todo o lugar é uma boa idéia. Considere este exemplo bastante artificial:
Foo.h
:
#include <set>
class Foo {
private:
static std::set<Foo*> instances;
public:
Foo();
~Foo();
// What does it return? Who cares! Just forward it!
static decltype(instances.begin()) begin() {
return instances.begin();
}
static decltype(instances.end()) end() {
return instances.end();
}
};
Foo.cpp
:
#include <Foo.h>
#include <Bar.h>
// The type need only be specified in one location!
// But I do have to open the header to find out what it actually is.
decltype(Foo::instances) Foo::instances;
Foo() {
// What is the type of x?
auto x = Bar::get_something();
// What does do_something() return?
auto y = x.do_something(*this);
// Well, it's convertible to bool somehow...
if (!y) throw "a constant, old school";
instances.insert(this);
}
~Foo() {
instances.erase(this);
}
Você diria que isso é razoável ou é completamente ridículo? Afinal, especialmente se você está acostumado a desenvolver em uma linguagem dinâmica, não precisa se preocupar muito com os tipos de coisas e pode confiar que o compilador detectará qualquer abuso flagrante do sistema de tipos. Mas para aqueles que dependem do suporte do editor para assinaturas de métodos, você está sem sorte; portanto, usar esse estilo em uma interface de biblioteca é provavelmente uma prática muito ruim.
Acho que escrever coisas com todos os tipos possíveis implícitos, na verdade, facilita muito o meu código, porque remove quase toda a desordem usual do C ++. Sua milhagem pode, é claro, variar, e é sobre isso que estou interessado em ouvir. Quais são as vantagens e desvantagens específicas do uso radical da inferência de tipo?