هل هناك طريقة لجمع الوقت تأكيد ما إذا كان المتغير هو فئة، بنية أو نوع الأساسي في ج ++؟

StackOverflow https://stackoverflow.com/questions/828442

  •  06-07-2019
  •  | 
  •  

سؤال

واني اسعى الى تطبيق فئة قالب التي من شأنها أن تكون قادرة على أن تقول لي إذا كان المتغير هو فئة، بنية أو نوع الأساسي.

وحتى الآن جئت مع هذا:

template< typename T >
class is_class
{
private:
    template< typename X >
    static char ( &i_class( void(X::*)() ) )[1];
    //
    template< typename X >
    static char ( &i_class( X ) )[2];
public:
    static bool const val = sizeof( i_class< T >(0) ) == 1;
};

ووussage:

is_class< int >::val; // false
is_class< some_class_type >::val; // true

والمشكلة هي أن الآن أنا بحاجة لكتابة وظيفة باطلة فارغة في كل فئة التي يمكن استخدامها مع هذا الرمز.

لا أحد يعرف حل لهذه المشكلة؟

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

المحلول

وis_class عضو في المكتبة Boost.Type_Traits. تنفيذ وربما على غرار ما لديك بالفعل. يمكنك استخدام في بالاشتراك مع enable_if لإنشاء وظيفة إذا كان ذلك مناسبا:

template <class T>
   typename enable_if_c<boost::is_class<T>::value>::type 
     foo() {  }

وأو ما يعادل:

template <class T>
   typename enable_if<boost::is_class<T>>::type 
     foo() {  }

ويتم إنشاء foo وظيفة فقط إذا كان نوع T هو من نوع فئة.

والقيمة مقابل وظيفة، إذا تم إنشاؤها، هي المعلمة الثانية (حذفت) إلى القالب enable_if (الافتراضي هو void).

نصائح أخرى

استخدم دفعة و نوع الصفات .

إذا انها مؤكدا فقط أثناء وقت الترجمة، يمكنك استخدام BOOST_STATIC_ASSERT و <لأ href = "http://www.boost.org/doc/libs/1_38_0/libs/type_traits/doc/html/index.html" يختلط = "نوفولو noreferrer"> Boost.TypeTraits للتحقق مما إذا أنواع هي مناسبة. إذا كنت تريد تمكين قالب لأنواع محددة، قد يكون النجاح باستخدام دفعة و<لأ href = "http://www.boost.org/doc/libs/1_38_0/libs/utility/enable_if.html" يختلط = "نوفولو noreferrer "> enable_if .

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