Parę sztuczek

0

Witam

Trochę już siedzę w C++, ale mam kilka pytań odnoście takich zagrań:

template<typename R, typename... T>
R LuaObject::callLuaField(const std::string& field, const T&... args) {
    R result;
    int rets = luaCallField(field, args...);
    if(rets > 0) {
        assert(rets == 1);
        result = g_lua.polymorphicPop<R>();
    } else
        result = R();
    return result;
}

Jeśli zrobiłem takie coś, to jak mogę później w funkcji CallField jakoś ogarnąć te argumenty, np. zrobić z nich pętle lub coś takiego.

Druga sprawa, tutaj znalazłem taki kod:

 template<typename C, typename... Args>
    std::function<void(const std::shared_ptr<C>&, const Args&...)> make_mem_func(void (C::* f)(Args...)) {
        auto mf = std::mem_fn(f);
        return [=](const std::shared_ptr<C>& obj, const Args&... args) mutable -> void {
            if(!obj)
                throw LuaException("failed to call a member function because the passed object is nil");
            mf(obj.get(), args...);
        };
    }

I nie wiem jak działa dokładnie to:

return [=](const std::shared_ptr<C>& obj, const Args&... args) mutable -> void {
            if(!obj)
                throw LuaException("failed to call a member function because the passed object is nil");
            mf(obj.get(), args...);
        };

Znaczy domyślam się, że to chyba funkcja anyomous (czy jakoś tak), która występuje w C#. Dobrze mówię, czy to nie to? Jeśli tak, to może ktoś mi to przybliżyć lub dać jakiś link?

Dzięki, to wszystko pozdrawiam

0

Zmienna liczba parametrów, użyj va_start, va_arg oraz va_end do ich odczytania.

0

nie wiem jak działa dokładnie to:

return [=](const std::shared_ptr<C>& obj, const Args&... args) mutable -> void {
            if(!obj)
                throw LuaException("failed to call a member function because the passed object is nil");
            mf(obj.get(), args...);
        };

Znaczy domyślam się, że to chyba funkcja anyomous (czy jakoś tak), która występuje w C#. Dobrze mówię, czy to nie to? Jeśli tak, to może ktoś mi to przybliżyć lub dać jakiś link?

Blisko, ale w C# Anonymous Methods ustąpiły już miejsca klasycznym wyrażeniom lambda.

Bo to jest właśnie wyrażenie lambda, dostępne w C++11:
http://pl.wikipedia.org/wiki/C%2B%2B11#Funkcje_i_wyra.C5.BCenia_lambda
http://stackoverflow.com/questions/7627098/what-is-a-lambda-expression-in-c11

Możesz to rozumieć tak, że zwracasz funkcję przyjmującą jako parametry const std::shared_ptr<C>& obj, const Args&... args i wykonującą mf(obj.get(), args...);.

1 użytkowników online, w tym zalogowanych: 0, gości: 1