Ini adalah fitur eksperimental modern C++ yang dapat diandalkan untuk proyek-proyek jangka panjang?
Saya memiliki sebuah proyek yang saat ini menggunakan C++11/14, tetapi membutuhkan sesuatu seperti std::filesystem
, yang hanya tersedia dalam C++17, dan karenanya saya don't memiliki kesempatan untuk saat menggunakannya. Saya melihat, bagaimanapun, bahwa itu's tersedia dalam saya saat ini compiler sebagai std::experimental::filesystem
. Itu ide yang baik untuk menggunakan fitur eksperimental, dengan asumsi bahwa saya dapat di masa depan menambahkan sesuatu seperti:
#ifdef CXX17 //if this is C++17
std::filesystem::something ...;
#else
std::experimental::filesystem::something ...;
#endif
Keprihatinan saya adalah:
1. Itu dijamin bahwa semua compliant penyusun yang sama-sama memiliki fitur eksperimental?
2. Ini adalah fitur eksperimental rentan terhadap perubahan besar yang membuat mereka tidak dapat diandalkan?
Mungkin ada's lebih banyak hal untuk bertanya-tanya tentang. Mengapa saya harus atau sebaiknya saya tidak menggunakannya? I'm bingung dengan sebuah proyek baru dan don't tahu apa yang harus memutuskan.
Tidak, fitur eksperimental adalah opsional.
Ya, C++ panitia bahkan mungkin memutuskan untuk meninggalkan fitur atau dalam proses standarisasi cacat mungkin akan muncul yang akan memaksa fitur untuk mengubah.
Umumnya, it's bukan ide yang baik untuk tergantung pada fitur eksperimental. Fitur eksperimental ini adalah persis apa kata firman (yaitu, untuk bereksperimen dengan).
Seseorang dari penonton mengajukan pertanyaan selama "C++ Standar Library Panel" berbicara di CppCon 2016 ([YouTube][1]) tentang potensi untuk nama
percobaan
untuk menakut-nakuti pengguna jauh dari menggunakan apa-apa di dalam namespace:Michael Wong (ketua SG5 dan SG14 dan editor dari Concurrency TS) menerjunkan pertanyaan pertama:
Alisdair Meredith (mantan ketua LWG) kemudian diikuti:
Stephan T. Lavavej (pengelola Microsoft's STL implementasi) adalah yang terakhir untuk menanggapi:
Jadi sepertinya bahwa ada beberapa keinginan di antara standar perpustakaan pengembang dan anggota komite itu, di masa depan, setidaknya, isi
std::eksperimental
namespace harus benar-benar "eksperimental" di alam, dan ini tidak boleh diambil untuk diberikan bahwa ada sesuatu distd::eksperimental
akan membuatnya menjadi standar C++.Dan tidak, sejauh yang saya mengerti, itu adalah sampai dengan standar perpustakaan vendor, apakah mereka menyediakan implementasi untuk berbagai fitur dalam
std::eksperimental
."Eksperimental" adalah sedikit berlebihan jangka panjang.
Sistem file
perpustakaan berasal dari Dorongan dan pergi melalui beberapa iterasi yang ada, sebelum diserahkan ke ISO.Namun, standar ISO sengaja very konservatif. Menyebutnya eksperimental berarti ISO secara eksplisit doesn't berjanji bahwa penamaan akan menjadi stabil; it's sangat jelas bahwa anda akan perlu untuk kembali alamat kode anda beberapa waktu di masa depan. Tapi mengetahui ISO, it's kemungkinan bahwa akan ada panduan bagaimana.
Untuk kompatibilitas antara compiler, berharap untuk menjadi yang wajar. Tapi akan ada kasus sudut (berpikir Jendela drive-jalur relatif, misalnya), dan yang's persis mengapa standar masa depan mungkin melanggar kode yang ada. Idealnya, itu akan memecahkan kode anda jika dan hanya jika anda bergantung pada sudut itu terjadi, tetapi itu's bukan jaminan.
Beberapa poin yang perlu dipertimbangkan:
Bagaimana multiplatform proyek anda? Jika hanya ada satu compiler yang terlibat, maka anda dapat memeriksa pelaksanaannya dan track record untuk memutuskan. Atau meminta mereka!
Seberapa besar anda codebase? Berapa besar dampak dari perubahan?
Bagaimana dasar untuk proyek anda adalah fitur yang disediakan oleh API/library/fitur?
Apa alternatifnya?
Gunakan fitur eksperimental, kemudian menyesuaikan kode untuk modifikasi ketika/jika itu menjadi standar. Mungkin semudah menghapus
eksperimental::
, atau sekeras memaksa workarounds.Tambahkan lapisan abstraksi (Serge Ballesta komentar). Jika fitur eksperimental perubahan re-menulis yang terisolasi. Untuk fitur standar, itu mungkin berlebihan (std::filesystem sudah lapisan abstraksi...).
Menggunakan API/library. Pertanyaan yang sama: kedewasaan? kekokohan? stabilitas? portabilitas? kemudahan penggunaan? fitur?
Dalam kasus std::filesystem (atau jaringan TS), ada boost::filesystem (resp. meningkatkan::asio) sebagai alternatif atau mundur, dalam kasus
eksperimental
satu gagal atau desappears.