سؤال

هذا شرط يصف طريقة، في C#، للسماح بإضافة أنواع قيم عشوائية لها عامل تشغيل + محدد لها.في جوهره يسمح بالكود التالي:

public T Add(T val1, T val2)
{
   return val1 + val2;
}

لا يتم تجميع هذا الرمز لأنه لا يوجد ضمان بأن النوع T له تعريف للمشغل '+'، ولكن يتم تحقيق التأثير باستخدام رمز مثل هذا:

public T Add(T val1, T val2)
{
   //Num<T> defines a '+' operation which returns a value of type T
   return (new Num<T>(val1) + new Num<T>(val2));
}

اتبع الرابط لترى كيف تحقق فئة Num ذلك.على أي حال، على السؤال.هل هناك أي طريقة لتحقيق نفس التأثير في C أو C++؟بالنسبة للفضوليين، المشكلة التي أحاول حلها هي السماح لنواة CUDA بأن تكون أكثر مرونة/عموما من خلال السماح لها بالعمل على المزيد من الأنواع.

تحديث: بالنسبة لـ .NET، قام مارك جرافيل بإنشاء مكتبة المرافق مما يحل مشكلة المشغل بشكل أنيق للغاية.

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

المحلول

ونظرا للطريقة التي يتم تجميع القوالب في C ++، ببساطة بهذا الأمر:

template < class T >
T add(T const & val1, T const & val2)
{
    return val1 + val2;
}

وستعمل، ستحصل على خطأ ترجمة لكل نوع حيث لم يتم تعريف المشغل +.

والقوالب C ++ توليد رمز لكل نوع مثيل، وذلك لسيتم إنشاء كل نوع T التعليمات البرمجية التي يفعل الشيء الصحيح. بهذه الطريقة C ++ لا يحتاج الصيغة الرقميه <> الخداع.

في سهل C، لم يكن ذلك ممكنا بقدر ما أعرف.

نصائح أخرى

في C++، هذه ببساطة ليست مشكلة. تعمل التعليمات البرمجية كما في العينة الأولى إذا تمت ترجمتها حرفيًا إلى C++ (ETA:كما فعل بيتر)، لكن لا يمكنني التفكير في أي موقف لن ينجح فيه الاستخدام المباشر +.أنت تبحث عن حل لمشكلة غير موجودة.

يمكن القيام بذلك بسهولة في لغة C++ باستخدام القوالب:


template <typename T>
T Add(T val1, T val2)
{
  return val1 + val2;
}

لكن لاحظ أن هذا يجب يتم تعريفها في ملف رأس، وربما تريد أيضًا تمرير المعلمات عن طريق مرجع ثابت بدلاً من القيمة.

لا يمكن القيام بذلك في عادي C على الإطلاق.

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

#define ADD(A,B) (A+B)

وقوالب في C ++. في C، لا يخلو من المتاعب واسعة النطاق والنفقات العامة.

template<typename T> 
T add(T x, T y)
{ 
    return x + y;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top