C ++ 0x menambahkan dukungan inferensi tipe komprehensif yang sangat sangat rumit. Saya sangat tergoda untuk menggunakannya sedapat mungkin untuk menghindari pengulangan yang tidak semestinya, tapi saya bertanya-tanya apakah menghapus informasi jenis eksplisit di semua tempat adalah ide yang bagus. Pertimbangkan contoh yang agak dibuat-buat ini:
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);
}
Apakah Anda mengatakan ini masuk akal, atau benar-benar konyol? Lagi pula, terutama jika Anda terbiasa berkembang dalam bahasa yang dinamis, Anda tidak benar-benar perlu peduli banyak tentang jenis hal, dan dapat percaya bahwa kompiler akan menangkap setiap penyalahgunaan mengerikan dari sistem tipe. Tetapi bagi Anda yang mengandalkan dukungan editor untuk tanda tangan metode, Anda kurang beruntung, jadi menggunakan gaya ini di antarmuka perpustakaan mungkin merupakan praktik yang sangat buruk.
Saya menemukan bahwa menulis hal-hal dengan semua jenis yang mungkin implisit sebenarnya membuat kode saya jauh lebih mudah bagi saya untuk diikuti, karena menghapus hampir semua kekacauan biasa dari C ++. Jarak tempuh Anda mungkin, tentu saja, bervariasi, dan itulah yang saya minati. Apa keuntungan dan kerugian spesifik dari penggunaan radikal inferensi tipe?