سؤال

نحن برمجة مكتبة تسجيل تحافظ على نفسها في ملف .hpp. نود أن تشمل <tr1/unordered_map> (إذا كان برنامج التحويل البرمجي يدعم TR1،) أو المعيار <map> غير ذلك. هل هناك طريقة قياسية للتحقق في وقت ترجمة إذا كانت TR1 متاحة أم لا؟

كنت أفكر في نفس الطريقة التي "__cplusplus"تحديد الرمز موجود، كان يمكن تعريفه"__cxx__tr1"أو شيء من هذا القبيل. لم أر ذلك في مسودات TR1، لذلك أفترض أنه غير موجود، لكنني أردت أن أسأل أولا فقط في حالة.

كملاحظة، إذا كانت تلك تعرف غير موجودة، فلن تكون فكرة سيئة تضمينها في مقترحات أنفسهم.

هل كانت مفيدة؟

المحلول

إذا كنت تستخدم أي أدوات تكوين مثل AutoTools، فقد تحاول كتابة اختبار مثل:

AC_CHECK_HEADER(tr1/unordered_map,[AC_DEFINE([HAVE_TR1],[],["Have tr1"])],[])
AC_CHECK_HEADER(unordered_map,[AC_DEFINE([HAVE_CXX0X],[],["Have C++0x"])],[])

ثم استخدم هذه تعرف في التعليمات البرمجية الخاصة بك.

بشكل عام __cplusplus يجب أن يمنحك الماكرو رقم الإصدار القياسي، ولكن لا يوجد مترجم يمنحك التنفيذ القياسي بنسبة 100٪ ... وبالتالي اكتب تكوين وحدات الماكرو.

لسوء الحظ، هذه طريقة موثوقة فقط للتحقق من هذه الأشياء إلا إذا كنت ترغب في كتابة 1001 #ifdef لكل مترجم (ما هو دفعة)

وثم:

#include "config.h"
#ifdef  HAVE_CXX0X
#  include <unordered_map>
   typedef std::unordered_map<foo,bar> my_map;
#elif HAVE_TR1
#  include <tr1/unordered_map>
   typedef std::tr1::unordered_map<foo,bar> my_map;
#else
#  include <map>
   typedef std::map<foo,bar> my_map;
#endif

نصائح أخرى

GCC-4.3 لديه:

#define __GXX_EXPERIMENTAL_CXX0X__ 1

ولكن من الواضح أن هذا ليس معيارا.

انظر ورقة ISO C ++ (WG21) N1575.. وبعد تم إسقاط هذه الورقة من TR1، دون أي بديل. لذلك لا توجد طريقة رسمية للكشف عن TR1.

تعامل مكتبة واحدة مع الاحتياجات لاستخدام بعض الفصول التي تمت إضافتها إلى TR1 من دفعة، تفضيل TR1 إذا كانت متوفرة. الحل (كونه مكتبة قائمة على أساس UNIX) هو دفع الشيكات إلى البرنامج النصي التكوين.

بمعنى آخر، لا، لا شيء محمول وأنا أعلم. ومع ذلك، إذا كنت على UNIX، فإن تكوين Script Checks يعمل بشكل جيد بما فيه الكفاية.

على افتراض أنه يستخدم VS2010، أو أي جناح يحتوي على TR1 المتاح، ماذا سيحدث إذا كان المرء يفعل

#include "boost/tr1/unordered_map.hpp"
...
std::tr1::unordered_map< ... > uMap;

ماذا سيكون نوع uMap يكون؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top