ইনলাইন নেমস্পেসগুলি একটি লাইব্রেরির সংস্করণ বৈশিষ্ট্য যা প্রতীক সংস্করণের অনুরূপ , তবে নির্দিষ্ট বাইনারি এক্সিকিউটেবল ফর্ম্যাটের বৈশিষ্ট্য (অর্থাত্ প্ল্যাটফর্ম-নির্দিষ্ট) না হয়ে সি ++ 11 স্তরে (অর্থাত্ ক্রস-প্ল্যাটফর্ম) বিশুদ্ধভাবে প্রয়োগ করা হয়েছে।
এটি এমন একটি প্রক্রিয়া যার মাধ্যমে একটি গ্রন্থাগার লেখক নেস্টেড নেমস্পেস চেহারা তৈরি করতে পারে এবং কাজ করতে পারে যেমন এর সমস্ত ঘোষণাগুলি আশেপাশের নেমস্পেসে ছিল (ইনলাইন নেমস্পেসগুলি নেস্ট করা যেতে পারে, তাই "আরও-নেস্টেড" নামগুলি সর্বপ্রথম অলঙ্কৃত করে -অনলাইন নেমস্পেস এবং চেহারা এবং এমনভাবে কাজ করুন যেন তাদের ঘোষণাপত্রের মধ্যে কোনও নেমস্পেসের মধ্যে থাকে)।
উদাহরণ হিসাবে, এর এসটিএল বাস্তবায়ন বিবেচনা করুন vector
। সি ++ এর শুরু থেকে যদি আমাদের ইনলাইন নেমস্পেস থাকে তবে সি ++ 98 এ শিরোনামটি <vector>
দেখতে দেখতে এমন হতে পারে:
namespace std {
#if __cplusplus < 1997L // pre-standard C++
inline
#endif
namespace pre_cxx_1997 {
template <class T> __vector_impl; // implementation class
template <class T> // e.g. w/o allocator argument
class vector : __vector_impl<T> { // private inheritance
// ...
};
}
#if __cplusplus >= 1997L // C++98/03 or later
// (ifdef'ed out b/c it probably uses new language
// features that a pre-C++98 compiler would choke on)
# if __cplusplus == 1997L // C++98/03
inline
# endif
namespace cxx_1997 {
// std::vector now has an allocator argument
template <class T, class Alloc=std::allocator<T> >
class vector : pre_cxx_1997::__vector_impl<T> { // the old impl is still good
// ...
};
// and vector<bool> is special:
template <class Alloc=std::allocator<bool> >
class vector<bool> {
// ...
};
};
#endif // C++98/03 or later
} // namespace std
এর মান উপর নির্ভর করে __cplusplus
, এক বা অন্য vector
বাস্তবায়ন বেছে নেওয়া হয়। আপনার কোডবেস প্রাক সি ++ 98 বার লেখা হয়েছিল, এবং আপনি যে সি ++ 98 সংস্করণ যদি vector
আপনি আপনার কম্পাইলার আপগ্রেড আপনার জন্য কষ্ট হয় যার ফলে, "সমস্ত" আপনাকে যা করতে হবে উল্লেখ খুঁজে পেতে std::vector
মধ্যে আপনার কোডবেস এবং এগুলি দ্বারা প্রতিস্থাপন std::pre_cxx_1997::vector
।
পরবর্তী মান এস, STL বিক্রেতা আবার প্রক্রিয়া পুনরাবৃত্তি, এর জন্য একটি নতুন নামস্থান প্রবর্তনের std::vector
সঙ্গে emplace_back
সমর্থন (যা সি প্রয়োজন ++, 11) এবং যে এক iff ইনলাইনিং __cplusplus == 201103L
।
ঠিক আছে, তবে এর জন্য আমার কেন একটি নতুন ভাষার বৈশিষ্ট্য প্রয়োজন? আমি ইতিমধ্যে একই প্রভাব করতে নিম্নলিখিতগুলি করতে পারি, না?
namespace std {
namespace pre_cxx_1997 {
// ...
}
#if __cplusplus < 1997L // pre-standard C++
using namespace pre_cxx_1997;
#endif
#if __cplusplus >= 1997L // C++98/03 or later
// (ifdef'ed out b/c it probably uses new language
// features that a pre-C++98 compiler would choke on)
namespace cxx_1997 {
// ...
};
# if __cplusplus == 1997L // C++98/03
using namespace cxx_1997;
# endif
#endif // C++98/03 or later
} // namespace std
এর মানের উপর নির্ভর করে __cplusplus
আমি বাস্তবায়নগুলির মধ্যে একটি বা অন্যটি পাই।
এবং আপনি প্রায় সঠিক হতে চাই।
নিম্নলিখিত বৈধ সি ++ 98 ব্যবহারকারীর কোডটি বিবেচনা করুন ( std
ইতিমধ্যে সি ++ 98 তে নামস্থানে থাকা টেম্পলেটগুলি সম্পূর্ণরূপে অনুমোদিত করার অনুমতি দেওয়া হয়েছিল ):
// I don't trust my STL vendor to do this optimisation, so force these
// specializations myself:
namespace std {
template <>
class vector<MyType> : my_special_vector<MyType> {
// ...
};
template <>
class vector<MyOtherType> : my_special_vector<MyOtherType> {
// ...
};
// ...etc...
} // namespace std
এটি পুরোপুরি বৈধ কোড যেখানে ব্যবহারকারী কোনও ধরণের সেটের জন্য ভেক্টরের নিজস্ব প্রয়োগের সরবরাহ করে যেখানে তিনি স্পষ্টতই এসটিএলে (তার অনুলিপি) পাওয়া একটির চেয়ে কার্যকর দক্ষতা জানে।
তবে : কোনও টেমপ্লেট বিশেষীকরণের সময়, আপনাকে এটি যে নাম স্থানটিতে ঘোষণা করা হয়েছিল তেমন করতে হবে The স্ট্যান্ডার্ডটি vector
নামস্থানটিতে এটি ঘোষিত হয়েছে std
, তাই ব্যবহারকারী যেখানে সঠিকভাবে প্রকারটি বিশেষায়িত করার প্রত্যাশা করেন।
এই কোডটি একটি অ-সংস্করণযুক্ত নেমস্পেসের সাথে কাজ করে std
, বা সি ++ 11 ইনলাইন নেমস্পেস বৈশিষ্ট্যটি ব্যবহার করে তবে ব্যবহৃত সংস্করণ কৌশলটি নয় using namespace <nested>
, কারণ এটি বাস্তবায়নের বিশদটি প্রকাশ করে যে সত্যিকারের নামস্থানটি vector
সংজ্ঞায়িত ছিল তা std
সরাসরি নয় ।
অন্যান্য ছিদ্র রয়েছে যার দ্বারা আপনি নেস্টেড নেমস্পেসটি সনাক্ত করতে পারেন (নীচে মন্তব্যগুলি দেখুন), তবে ইনলাইন নেমস্পেসগুলি সেগুলি সমস্ত প্লাগ করে। এবং এটি সব আছে। ভবিষ্যতের জন্য অপরিসীম দরকারী, তবে এএফআইএকি স্ট্যান্ডার্ড নিজস্ব স্ট্যান্ডার্ড লাইব্রেরির জন্য ইনলাইন নেমস্পেসের নামগুলি লিখেনি (যদিও আমি এটির জন্য ভুল প্রমাণিত হতে চাই), তাই এটি কেবল তৃতীয় পক্ষের লাইব্রেরির জন্য ব্যবহার করা যেতে পারে, না মান নিজেই (সংকলক বিক্রেতারা নামকরণের স্কিমের সাথে একমত না হলে)।
using namespace V99;
স্ট্রস্ট্রপের উদাহরণে কেন কাজ করে না তা ব্যাখ্যা করার জন্য +1 ।