سؤال

لبنية معينة:

struct foo
{
    void fooFunc(){}
    int fooVar = 0;
};

يمكنني إنشاء wapper للوظيفة: std::mem_fn( &foo::fooFunc ) بحيث يمكنني تمريرها إلى طريقة أخرى واستدعائها على كائن.
أريد أن أعرف ما إذا كان هناك برنامج تجميع استدعاء مماثل ولكن لمتغيرات الأعضاء.

على سبيل المثال، أستخدم مؤشرًا لمتغير عضو هنا ولكني أرغب في استخدام برنامج تضمين المكالمات:

void bar( std::function< void( foo ) > funcPtr, int foo::* varPtr )
{
    foo myFoo;
    funcPtr( myFoo );
    foo.*varPtr = 13;
}
هل كانت مفيدة؟

المحلول

ملحوظة:لا يوجد شيء في سؤالك من المحكمة الخاصة بلبنان (وهي مكتبة من التسعينيات)، std::function و std::mem_fn هي جزء من مكتبة C++ القياسية، وهي ليست نفس الشيء.

std::mem_fn يدعم وظائف الأعضاء ومتغيرات الأعضاء، لذلك يمكنك القيام بذلك فقط للوصول إلى متغير العضو وتعيينه:

foo f;
std::function<int&(foo&)> var( std::mem_fn( &foo::fooVar ) );
var(f) = 1;

نصائح أخرى

بالإضافة إلى وظائف الأعضاء، std::mem_fn يمكنه تغليف أعضاء البيانات أيضًا، والسماح بالوصول للقراءة لهم.لذلك يعمل ما يلي:

void print_fooVar(foo& f, std::function<int(foo)> varAccess)
{
    std::cout << varAccess(f) << std::endl;
}

foo f;
print_fooVar(f, std::mem_fn(&foo::fooVar)); // prints 0

كما ذكر JonathanWakely في التعليقات، يمكنك استخدام النوع (غير المحدد) الذي يتم إرجاعه بواسطة mem_fn نفسه لتعيين عضو البيانات.

foo f;
std::mem_fn(&foo::fooVar)(f) = 13;

أو لتحويله إلى std::function يستخدم

void bar( foo& f, std::function<int&(foo&)> fooVarSet )
{
    fooVarSet(f) = 26;
}

إذا كان كل ما تبحث عنه هو طريقة لإنشاء كائن قابل للاستدعاء لتعيين fooVar عضو البيانات، وعدم استخدام std::mem_fn وللقيام بذلك على وجه التحديد، يمكنك إنجاز المهمة باستخدام تعبير لامدا أيضًا.

void bar( foo& f, std::function<void(foo)> funcPtr, 
                  std::function<void(foo&, int)> fooVarSet )
{
    funcPtr( f );
    fooVarSet(f, 13);
}

foo f;
bar(f, std::mem_fn(&foo::fooFunc), [](foo& f, int i) {f.fooVar = i;});

عرض حي

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