العمليات على أنواع القيمة التعسفية
-
03-07-2019 - |
سؤال
هذا شرط يصف طريقة، في 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;
}