mynine: (japan)
[personal profile] mynine
В последние дни опробовал парочку новых для себя приемов в программировании совсем в разных областях: запустил coroutine в скриптах Lua внутри моего приложения и понял как использовать шаблоны C++ с переменным числом аргументов.

Coroutine дает возможность создавать программы с несколькими точками входа и выхода внутри, что удобно, например, для обработки удаленных данных и позволяет снаружи обеспечивать работу скрипта используя вызов всего одной функции.

А variadic шаблоны C++ позволяют нынче делать совсем уже прежде немыслимые вещи для статически типизированного языка - создавать функции с переменным числом аргументов любых типов и получать внутри доступ ко всем этим аргументам через перебор. Крутотень! Сейчас, правда, код выглядит слегка перегруженным, потому что в современном C++ нет стандартных методов перебора элементов кортежа, но, надеюсь, они скоро будут и тогда код упростится совсем.

// Пример реализации кода функции логгера с переменным числом аргументов
// мопед не мой - нашел на StackOverflow и использовал идею у себя
#include <tuple>
#include <utility>
#include <iostream>

template<std::size_t N> struct tuple_functor {
    template<typename T, typename F> static void run(size_t i, T&& t, F&& f) {
        const std::size_t I = (N - 1);
        switch (i) {
        case I:
            std::forward<F>(f)(std::get<I>(std::forward<T>(t)));
            break;
        default:
            tuple_functor<I>::run(i, std::forward<T>(t), std::forward<F>(f));
        }
    }
};

template<> struct tuple_functor<0> {
    template<typename T, typename F>
    static void run(std::size_t, T, F) {}
};

template<typename ... T> void logger(T ... args) {
    const std::size_t num = sizeof ... (T);
    auto my_tuple = std::forward_as_tuple(args ...);
    auto do_sth = [](const auto& elem) {
        std::cout << elem << std::endl;
    };
    for (int i = 0; i < num; ++i)
        tuple_functor<num>::run(i, my_tuple, do_sth);
}

int main() {
    logger("adbc", 123, "xf", 2.0);  
    return 0;
}

From:
Anonymous( )Anonymous This account has disabled anonymous posting.
OpenID( )OpenID You can comment on this post while signed in with an account from many other sites, once you have confirmed your email address. Sign in using OpenID.
User
Account name:
Password:
If you don't have an account you can create one now.
Subject:
HTML doesn't work in the subject.

Message:

 
Notice: This account is set to log the IP addresses of everyone who comments.
Links will be displayed as unclickable URLs to help prevent spam.

Profile

mynine: (Default)
ИБО

March 2017

S M T W T F S
   1 234
5678910 11
12131415161718
19202122232425
262728293031 

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 25th, 2017 04:51 pm
Powered by Dreamwidth Studios