C ++ 0x aggiunge un supporto inferenziale di tipo completo e dannatamente completo. Sono strongmente tentato di usarlo ovunque possibile per evitare ripetizioni ingiustificate, ma mi chiedo se la rimozione di informazioni di tipo esplicito dappertutto sia una buona idea. Considera questo esempio piuttosto forzato:
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);
}
Diresti che è ragionevole o è completamente ridicolo? Dopotutto, specialmente se sei abituato a sviluppare in un linguaggio dinamico, non devi aver bisogno di preoccuparti di tutto ciò che riguarda i tipi di cose, e puoi avere fiducia che il compilatore catturerà qualsiasi egregio abusi del sistema di tipo. Ma per quelli di voi che si affidano al supporto dell'editor per le firme dei metodi, si è sfortunati, quindi usare questo stile nell'interfaccia di una libreria è probabilmente una cattiva pratica.
Trovo che scrivere cose con tutti i tipi possibili impliciti rende il mio codice molto più facile da seguire, perché rimuove quasi tutto il solito ingombro di C ++. Il tuo chilometraggio può, ovviamente, variare, ed è quello che mi interessa sapere. Quali sono i vantaggi e gli svantaggi specifici dell'uso radicale dell'inferenza di tipo?