Вызов и выход из методов с использованием переменных аргументов из класса контейнера шаблонов с переменными параметрами - PullRequest
0 голосов
/ 09 января 2019

Мне нужно избавиться от старого вариационного синтаксиса c ++ 98 и использовать современные вариационные шаблоны и аргументы c ++ 17 для поддержки входных и выходных вызовов (во время выполнения) функций и функций интерпретатора.

Я на самом деле пытаюсь ... проверить его механику:

template<typename C, typename R, typename ...A>
class methodology{

    std::string _name;

    C* rt_obj = nullptr;

    using rt_fn_t = R(C::*)(A...);
    rt_fn_t rt_fn = nullptr;
    //using out_fn_t  = alu(const alu::list_t& params);

public:
    // `alu` is a custom std::any wrapper container class:
    // Kind of Arithmetic Logical Unit. 

    // teasing js dangerous style
    std::string& name() { return _name; }

    // Runtime calling a given "named" function into the interpreter:
    R operator()(const A& ...args){ 
        // pack into our alu list:        
        auto param = [](auto a){
            return alu(a);
        };

        alu::list_t params = { param(args)...};
        alu a = interpreter::enter(_name, params);

        return a.value<R>();
    }

    /*
       Called from inside the interpreter:
    */
    alu operator()(const alu::list_t& params){
        // Here is my lack of c++ 17 functional knowledges:
        //how to : params => A..args, using this class's typename ...A ???
        return (rt_obj->*rt_fn)(args...);
        return alu(false); // default. Unimplemented.
    }
};

Мои проблемы: (Пожалуйста, обратитесь к моему заголовочному файлу класса "alu", если вам нужна более подробная информация: https://github.com/bretzel/xio/blob/master/xio%2B%2B/interpreter/kernel/alu.hpp,, а затем просмотреть фактический старый уродливый синтаксис: https://github.com/bretzel/xio/blob/master/xio%2B%2B/interpreter/kernel/function_t.hpp)

std::apply(...,std::tuple<>) кажется, что путь, но: Как мне построить std::tuple<(methodology<typename...A>)> из списка "alu", каждый из которых "alu" глубоко содержит тип аргумента в своем внутреннем объекте "std::any"?

1 Ответ

0 голосов
/ 09 января 2019

Не уверен, что понимаю, что ты хочешь и как работает alu, но ... Я полагаю, ты выглядишь следующим образом (осторожно: код не проверен; извините)

template <std::size_t ... Is>
alu op_helper (alu::list_t const & params, std::index_sequence<Is...> const &)
 { return (rt_obj->*rt_fn)(params[Is].value<A>()...); }

auto operator() (alu::list_t const & params)
 { return op_helper(params, std::index_sequence_for<A...>{}); }

Не по теме: учитывая, что ваш класс alu содержит ограниченный и известный набор возможных типов, не лучше std::variant вместо std::any?

...