Saya memiliki proyek yang saat ini menggunakan C ++ 11/14, tetapi membutuhkan sesuatu seperti std::filesystem
, yang hanya tersedia di C ++ 17, dan karenanya saya tidak memiliki kesempatan untuk menggunakannya saat ini. Saya melihat, bagaimanapun, bahwa itu tersedia di kompiler saya saat ini sebagai std::experimental::filesystem
. Apakah ide yang baik untuk menggunakan fitur eksperimental, dengan asumsi bahwa saya dapat menambahkan sesuatu seperti ini di masa mendatang:
#ifdef CXX17 //if this is C++17
std::filesystem::something ...;
#else
std::experimental::filesystem::something ...;
#endif
Kekhawatiran saya adalah:
1. Apakah dijamin bahwa semua kompiler yang sesuai memiliki fitur eksperimental yang sama?
2. Apakah fitur eksperimental rentan terhadap perubahan besar yang membuatnya tidak dapat diandalkan?
Mungkin ada lebih banyak hal yang perlu ditanyakan. Mengapa saya harus atau tidak boleh menggunakannya? Saya bingung dengan proyek baru dan tidak tahu harus memutuskan apa.
sumber
#idef CXX17
. IMHO, cara portabel adalah dengan meletakkan semua kode terkait sistem file dalam satu unit kompilasi tunggal (mungkin kelas), gunakan di seluruh bagian kode yang tersisa, kodekan dengan standar C ++ 11/14 saat ini. Dokumentasikan bagaimana dan mengapa Anda menulisnya seperti itu, dan akhirnya port ke C ++ 17 nanti selama fase pemeliharaan, jika masuk akal. (Mengomentari pertanyaan awal)filesystem
Anda menanggung risiko yang jauh lebih kecil dalam menggunakannya daripada hal-hal lain, karena Anda sudah tahu bahwa itu distandarisasi dalam C ++ 17, dan spesifikasi C ++ 17 yang tepat tersedia untuk umum. Jadi yang harus Anda lakukan adalah memastikan bahwa Anda hanya menggunakanexperimental::filesystem
fitur yang ada dalam spesifikasi C ++ 17. Dan tentu saja Anda harus tahu bahwa semua platform yang Anda targetkan mendukung salah satuexperimental::filesystem
atau C ++ 17std::filesystem
.Jawaban:
Tidak, fitur eksperimental bersifat opsional.
Ya, komite C ++ bahkan mungkin memutuskan untuk meninggalkan fitur atau dalam proses standarisasi cacat mungkin muncul yang akan memaksa fitur berubah.
Umumnya, bergantung pada fitur eksperimental bukanlah ide yang baik. Fitur eksperimental persis seperti yang dikatakan kata (yaitu, bereksperimen).
sumber
Seseorang dari audiens mengajukan pertanyaan selama sesi "C ++ Standard Library Panel" di CppCon 2016 ( YouTube ) tentang potensi nama tersebut
experimental
untuk menakut-nakuti pengguna agar tidak menggunakan apa pun di dalam namespace:Michael Wong (ketua SG5 dan SG14 dan editor Concurrency TS) mengajukan pertanyaan terlebih dahulu:
Alisdair Meredith (mantan ketua POKJA) kemudian menindaklanjuti:
Stephan T. Lavavej (pengelola implementasi STL Microsoft) terakhir menanggapi:
Jadi tampaknya ada keinginan di antara pengembang perpustakaan standar dan anggota komite bahwa, setidaknya di masa mendatang, konten
std::experimental
namespace harus benar-benar bersifat "eksperimental", dan tidak boleh dianggap remeh bahwa sesuatu distd::experimental
akan membuatnya menjadi standar C ++.Dan tidak, sejauh yang saya mengerti, terserah vendor perpustakaan standar, apakah mereka menyediakan implementasi untuk berbagai fitur di dalamnya
std::experimental
.sumber
"Eksperimental" adalah istilah yang agak dibesar-besarkan. The
filesystem
perpustakaan berasal Boost dan pergi melalui beberapa iterasi sana, sebelum diajukan ke ISO.Namun, standar ISO sengaja dibuat sangat konservatif. Menyebutnya eksperimental berarti ISO secara eksplisit tidak menjanjikan bahwa penamaan akan stabil; sangat jelas bahwa Anda perlu mengalamatkan ulang kode Anda suatu saat nanti. Namun mengetahui ISO, kemungkinan besar akan ada panduan caranya.
Adapun kompatibilitas antara kompiler, diharapkan itu masuk akal. Tetapi akan ada kasus sudut (pikirkan jalur relatif drive Windows misalnya), dan itulah mengapa standar masa depan dapat merusak kode yang ada. Idealnya, ini akan merusak kode Anda jika dan hanya jika Anda bergantung pada casing sudut itu, tetapi itu bukan jaminan.
sumber
Beberapa hal yang perlu diperhatikan:
Seberapa multiplatform proyek Anda? Jika hanya ada satu kompiler yang terlibat, maka Anda dapat memeriksa implementasinya dan rekam jejaknya untuk memutuskan. Atau tanya mereka!
Seberapa besar basis kode Anda? Seberapa besar dampak perubahan?
Seberapa mendasar bagi proyek Anda fitur-fitur yang disediakan oleh API / library / feature?
Apa alternatifnya?
experimental::
, atau sesulit solusi paksa.experimental
salah satu gagal atau menghilang.sumber