هل هذه هي أفضل طريقة للقيام ببيان "مع" في C ++؟

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

  •  27-09-2019
  •  | 
  •  

سؤال

يحرر:

لذلك تم إساءة تفسير هذا السؤال إلى درجة سخيفة لدرجة أنه لم يعد له أي نقطة. لا أعرف كيف, ، منذ السؤال الذي أنا في الواقع طلبت كان ما إذا كان تنفيذي المحدد من هذا - نعم ، المعروف أنه لا طائل منه ، نعم ، لا يشبه عن بعد C ++ - كان الماكرو جيدًا كما يمكن أن يكون ، وما إذا كان يتعين عليه بالضرورة استخدامه auto, ، أو إذا كان هناك حل مناسب بدلاً من ذلك. لم يكن من المفترض أن يولد هذا الاهتمام الكبير ، وبالتأكيد ليس سوء فهم لهذا الحجم. من غير المجدي أن أطلب من المجيبين تحرير إجاباتهم ، لا أريد أن يفقد أي شخص سمعة هذا ، وهناك بعض المعلومات الجيدة التي تطفو هنا للمشاهدين المحتملين في المستقبل ، لذلك سأختار واحدة من الأسفل المدمر إجابات لتوزيع السمعة المتضمنة بالتساوي. تحرك على طول ، لا شيء لرؤيته هنا.


لقد رأيت هذا السؤال وقررت أنه قد يكون من الممتع كتابة أ with بيان في C ++. ال auto الكلمة الرئيسية تجعل هذا الأمر سهلاً حقًا ، ولكن هل هناك طريقة أفضل للقيام بذلك ، ربما دون استخدام auto؟ لقد قمت بإلغاء أجزاء معينة من الكود للإيجاز.

template<class T>
struct with_helper {

    with_helper(T& v) : value(v), alive(true) {}

    T* operator->() { return &value; }
    T& operator*() { return value; }

    T& value;
    bool alive;

};


template<class T> struct with_helper<const T> { ... };


template<class T> with_helper<T>       make_with_helper(T& value) { ... }
template<class T> with_helper<const T> make_with_helper(const T& value) { ... }


#define with(value) \
for (auto o = make_with_helper(value); o.alive; o.alive = false)

إليك مثال استخدام (محدث) مع حالة أكثر نموذجية توضح استخدام with كما هو موجود في لغات أخرى.

int main(int argc, char** argv) {

    Object object;

    with (object) {

        o->member = 0;
        o->method(1);
        o->method(2);
        o->method(3);

    }

    with (object.get_property("foo").perform_task(1, 2, 3).result()) {

        std::cout
            << (*o)[0] << '\n'
            << (*o)[1] << '\n'
            << (*o)[2] << '\n';

    }

    return 0;

}

اخترت o لأنه معرف غير شائع ، ويعطي شكله انطباعًا عن "شيء عام". إذا كان لديك فكرة لمعرف أفضل أو بناء جملة أكثر قابلية للاستخدام تمامًا ، فالرجاء اقتراحه.

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

المحلول

؟ حاول بناء جملة VB في C ++

with يقول هل كل الأشياء في الكتلة التالية بشكل افتراضي تشير إلى الكائن الذي قلته للقيام بذلك مع الحق؟ ينفذ سلسلة من العبارات التي تشير إلى كائن أو بنية واحدة.

with(a)
 .do
 .domore
 .doitall

فكيف يمنحك المثال نفس بناء الجملة؟

بالنسبة لي أمثلة على سبب استخدام A مع وجود مرجعية متعددة

لذلك بدلا من

book.sheet.table.col(a).row(2).setColour
book.sheet.table.col(a).row(2).setFont
book.sheet.table.col(a).row(2).setText
book.sheet.table.col(a).row(2).setBorder

عندك

with( book.sheet.table.col(a).row(2) )
  .setColour
  .setFont
  .setText
  .setBorder

يبدو بنفس السهولة ، وبناء جملة أكثر شيوعًا في C ++

cell& c = book.sheet.table.col(a).row(2);
c.setColour
c.setFont
c.setText
c.setBorder

نصائح أخرى

كما ترى auto, لماذا تستخدم وحدات الماكرو على الإطلاق؟

int main()
{
    std::vector<int> vector_with_uncommonly_long_identifier;

    {
        auto& o = vector_with_uncommonly_long_identifier;

        o.push_back(1);
        o.push_back(2);
        o.push_back(3);
    }

    const std::vector<int> constant_duplicate_of_vector_with_uncommonly_long_identifier
        (vector_with_uncommonly_long_identifier);

    {
        const auto& o = constant_duplicate_of_vector_with_uncommonly_long_identifier;

        std::cout
            << o[0] << '\n'
            << o[1] << '\n'
            << o[2] << '\n';
    }

    {
        auto o = constant_duplicate_of_vector_with_uncommonly_long_identifier.size();
        std::cout << o <<'\n';
    }
}

تحرير: بدون auto, ، فقط استخدم typedef والمراجع.

int main()
{
    typedef std::vector<int> Vec;

    Vec vector_with_uncommonly_long_identifier;

    {
        Vec& o = vector_with_uncommonly_long_identifier;

        o.push_back(1);
        o.push_back(2);
        o.push_back(3);
    }
}

لـ C ++ 0x (الذي تفترضه):

int main() {

    std::vector<int> vector_with_uncommonly_long_identifier;

    {
        auto& o = vector_with_uncommonly_long_identifier;

        o.push_back(1);
        o.push_back(2);
        o.push_back(3);

    }
}

لماذا لا تستخدم فقط Lambda جيد؟

auto func = [&](std::vector<int>& o) {
};
func(vector_with_a_truly_ridiculously_long_identifier);

الحقيقة البسيطة هي أنه إذا كانت معرفاتك طويلة جدًا ، فلن تتمكن من كتابتها في كل مرة ، أو استخدام مرجع أو وظيفة أو مؤشر ، وما إلى ذلك لحل هذه المشكلة ، أو أفضل ، إعادة تشكيل الاسم. مثل هذه العبارات (على سبيل المثال باستخدام () في C#) لها آثار جانبية إضافية (تنظيف حتمي ، في مثالي). لا يحتوي بيانك في C ++ على فوائد فعلية ملحوظة ، لأنه لا يستدعي فعليًا أي سلوك إضافي مقابل كتابة الرمز.

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