هل هناك طريقة لجمع الوقت تأكيد ما إذا كان المتغير هو فئة، بنية أو نوع الأساسي في ج ++؟
-
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 .