Hi.
How to rewrite this in D to the handler method for the input parameter was determined on average in O(1)?

#include <string>
#include <iostream>
#include <functional>
#include <unordered_map>

class A
{
public:
    void foo(const std::string &s);

protected:
    void foo1(const std::string &s);
    void foo2(const std::string &s);
    void foo3(const std::string &s);

    std::string m_buf;
};

int main()
{
    A a;
    a.foo("first");
    a.foo("second");
    a.foo("third");
}

void A::foo(const std::string &s)
{
    using func = std::function < void(A &, const std::string &) >;
    static const std::unordered_map<std::string, func> handlers =
    {
        { "first",  std::mem_fn(&A::foo1) },
        { "second", std::mem_fn(&A::foo2) },
        { "third",  std::mem_fn(&A::foo3) }
    };

    const auto cit = handlers.find(s);
    if (cit != handlers.cend())
        cit->second(*this, s);

    m_buf += s + ' ';
}

void A::foo1(const std::string &s)
{
    std::cout << s << std::endl;    // prints first
}

void A::foo2(const std::string &s)
{
std::cout << std::string(s.rbegin(), s.rend()) << std::endl; // prints dnoces
}

void A::foo3(const std::string &s)
{
std::cout << s << ", " << m_buf << std::endl; // prints third, first second
}

Reply via email to