Hỏi: kỹ thuật map chuỗi thành hàm

Một tác vụ thường gặp trong nhiều chương trình là tác vụ sau đây. Ví dụ trong C++. Với mỗi chuỗi nhập std::string str khác nhau, ta cần gọi một hàm tương ứng. Ví dụ, nếu str == "sin" thì ta gọi hàm sin, str == "abc" thì ta gọi hàm foo(), còn nếu str không phải là một trong các chuỗi cho trước thì trả về lỗi, chẳng hạn. Tổng số các hàm cần gọi là rất lớn.

Trường hợp 1: nếu tất cả các hàm cần gọi có cùng tập tham số, ta có thể xây dựng một map từ std::string đến function pointers, mỗi pointer trỏ đến hàm tương ứng.

Trường hợp 2: nếu các hàm cần gọi có bộ tham số khác nhau thì có thể dùng polymorphism, và cái map sẽ map từ std::string đến pointer vào base class. (Hoặc, để chương trình gọn hơn có thể overload () operator, biến chúng thành functors, nhưng ý tưởng vẫn như cũ.)

Bạn có biết cách nào hay hơn, hoặc khác hơn, không?

Chủ đề : Lập trình and tagged , , , . Bookmark the permalink. Trackbacks are closed, but you can post a comment.

10 Comments

  1. dv
    Posted 13/01/2012 at 11:08 am | Permalink

    Trường hợp nếu các hàm cần gọi có cùng bộ tham số thì có thể không cần dùng function pointer. Ví dụ:

    int test(int iTest1, int iTest2, int iDesireFunction)
    {
    switch (iDesireFunction)
    {
    case FUNC1:
    return function1(int iTest1, int iTest2);
    case FUNC2:
    return function2(int iTest1, int iTest2);
    …………
    default:
    return ERR;
    }
    }

    • Posted 13/01/2012 at 1:00 pm | Permalink

      @dv: switch không làm việc với string

  2. sontran
    Posted 14/01/2012 at 12:00 am | Permalink

    http://www.codeproject.com/KB/cpp/FastDelegate.aspx

    *. Note that the classic smart pointer implementations (Loki and boost) don’t bother.
    [Sutter1]. Generalized function pointers: a discussion of how boost::function has been accepted into the new C++ standard.
    [Sutter2]. Generalizing the Observer pattern (essentially, multicast delegates) using std::tr1::function. Discusses the limitations of the failure of boost::function to provide operator ==.
    [Sutter3]. Herb Sutter’s Guru of the Week article on generic callbacks.
    [Dlugosz]. A recent implementation of delegates/closures which, like mine, is optimally efficient, but which only works on MSVC7 and 7.1. “>

    • Posted 14/01/2012 at 9:36 am | Permalink

      @sontran, cảm ơn nhiều! Bài giàu thông tin & rất hay. Bây giờ chắc phải đi học Boost, thấy nhiều bà con trên stackoverflow có vẻ rất passionate về Boost.

      • Khoa
        Posted 26/01/2012 at 3:10 am | Permalink

        Anh Hưng cầng tìm phương pháp hay hơn nghĩa là thế nào? Kỹ thuật 2 bất tiện ở điểm nào?

      • Khoa
        Posted 26/01/2012 at 3:37 am | Permalink

        Boost rộng như biển cả: từ linear algebra đến smart pointer cũng có. Anh học Boost thì khác gì học cả cái Java API hay đọc hết các bài báo trong journals? 😀

        Bà con passionate với “Boost” (which Boost) là do Boost is the extension of C++ standard library. Boost so với C++ Standard Library cũng giống như CS Conferences so với CS Journals. Nhiều features chưa kịp hoặc không standardized bởi C++ Committee thì nằm ở Boost. Cái nào highly popular thì sẽ được included (and further improved) vào C++ next version. Chẳng hạn mấy features mới của C++11 đa số evolve từ Boost.

  3. Chaien
    Posted 18/01/2012 at 1:14 am | Permalink

    Bác Hưng:
    Em thấy trong .Net có khái niệm Delegate, không biết kĩ thuật này có giải quyết được câu hỏi của bác không?

    • Posted 18/01/2012 at 2:22 pm | Permalink

      @Chaien: đúng là tôi hỏi về (một kiểu) delegate pattern; ý tôi hỏi về implementation của pattern này. Hừm, lần đầu đọc sách của Gang of Four đã là 14 năm trước. Thời gian bay!

  4. Khoa
    Posted 26/01/2012 at 3:14 am | Permalink

    Anh Hưng cần tìm phương pháp hay hơn nghĩa là thế nào? Kỹ thuật 2 bất tiện ở điểm nào?

    • Posted 26/01/2012 at 10:53 am | Permalink

      Hi Khoa, cũng không quá bất tiện; tôi chỉ muốn biết là còn cách nào khác không thôi. Về cơ bản, kể cả khi ta dùng kỹ thuật 2, thì compiler cũng chuyển mọi thứ thành kỹ thuật 1.

Post a Comment

Your email is never published nor shared. Required fields are marked *

You may use these HTML tags and attributes <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*
*