يمكن استخدام نتيجة استدعاء دالة كقيمة المعلمة الافتراضية؟

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

  •  03-07-2019
  •  | 
  •  

سؤال

هل هناك طريقة جيدة لكتابة C رؤوس ظيفة / C ++ مع المعلمات الافتراضية التي المكالمات وظيفة؟

ولدي بعض الرأس مع وظيفة:

int foo(int x, int y = 0);

وأنا أعمل في قاعدة رمز كبير حيث تدعو العديد من وظائف هذه الوظيفة وتعتمد على هذه القيمة الافتراضية. يحتاج هذه القيمة الافتراضية الآن لتغيير شيء دينامية وأنا أبحث عن طريقة للقيام:

int foo(int x, int y = bar());

وأين شريط () هي بعض من وظيفة التي تولد القيمة الافتراضية استنادا إلى بعض المعلمات النظام. بدلا من هذه الوظيفة النموذج ستبدو:

int foo(int x, int y = baz.bar());

وأين الباز هي وظيفة تابعة لكائن لم مثيل في ملف الرأس.

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

المحلول

ويذهب الرقم! انها تقوم بالعمل. <وأ href = "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp؟topic=/com.ibm.xlcpp8l.doc/language/ref/cplr237.htm" يختلط = "noreferrer "> الحجج افتراضي في C ++ وظائف

نصائح أخرى

وأود أن استخدام وظيفتين مثقلة:

وint foo(int x, int y);

وint foo(int x){return foo(x,bar);}

إذا كنت تسمح وظيفة إحالتها إلى أن inlined، ثم من المرجح أن صغيرة إلى الصفر عقوبة الأداء. اذا واصلتم على جثة بها من خط في ملف غير رأس قد تكون هناك تكلفة الأداء (من المرجح أن تكون صغيرة)، ولكن أكثر من ذلك بكثير من المرونة في التنفيذ وتخفيض اقتران.

نعم. ما قمت الأعمال المكتوبة.

ما هو الخطأ مع ببساطة إزالة المعلمة اختيارية في أول إعلان وتوفير الزائد المعلمة واحد؟

int foo(int x)
{
    Bar bar = //whatever initialization
    return foo(x,bar.baz());
}

int foo(int x,int y)
{
  //whatever the implementation is right now
}

وأعتقد أن هذا يميل إلى أن يكون أكثر نظافة وأكثر مرونة من محاولة استخدام بعض القيمة الافتراضية الحيوية.

في المعيار، القسم 8.3.6 (الحجج افتراضي)، الفقرة 5، فإنها تعطي مثالا فقط باستخدام هذا النهج. على وجه التحديد، فإنه يدعو إلى أن الحجج الافتراضية هي <م> تعبيرات ، لذلك ينطبق استدعاء دالة، ولكن مع قيود مثل البحث عن اسم ونوع التوافق.

في مكان عملي، ونحن قد استخدمت توقيعات من هذا القبيل:

void An_object::An_object(
  const Foo &a,
  const Bar &b,
  const Strategem &s = Default_strategem()
);

وللسماح للعملاء لتجاوز سلوك في منشئ الفئة. وجاء في متناول اليدين لسلوك مشروط التي أثرت على أداء مترجم ...

وتماسي، ولكن هذا يبدو لي انها تريد إدخال قضايا الاعتماد على الطريق. كنت اذهب مع النهج stbuton.myopenid.com ل.

ويجب أن تكون صالحة تماما للدعوة الى وظيفة عمومية أو مرجع كائن العالمي في هذا السياق، طالما أن الإعلان عن وظيفة / الكائن في نطاقها. فإنه قد يكون أو لا يكون من المستحسن (من حيث التصميم الجيد)، ولكن ينبغي لها أن تعمل.

ومحاولة جعل شريط () دالة عضو ثابتة. وهذا سوف يسمح أي جزء من البرنامج الذي لديه مثل هذه الدرجة ثابتة في نطاق الوصول إليه. على سبيل المثال:

والطبقة فو { الجمهور:

وشريط الباحث ثابت ()؛ }؛

وبعد أن قمت بتعريف:

والباحث فو (كثافة العمليات خ، ذ كثافة العمليات = فو :: شريط ())؛

إذا كنت بحاجة إلى كائنات مختلفة ثم تمرير في مثيل الكائن بدلا من ذلك.

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