Применение функции к каждому элементу в пакете параметров происходит в неправильном порядке

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

Код:

template <typename R, typename... Args>
void ApplyString(R(*func)(Args...), std::string args)
{
auto argtuple = std::make_tuple(GetToken<Args>(args)...);
typename GetIndexTuple<Args...>::type indices;
ApplyTuple(func, argtuple, indices);
}

Цель:

Целью кода является токенизация каждого аргумента функции из строки. Что я делаю, так это применяю функцию токенизации при расширении пакета параметров (Args...) в кортеж. Затем я использую эту функцию для вызова ApplyTuple который делает то, что говорит. И это работает … вроде …

Проблема:

Проблема в том, что в make_tuple Последовательность, последняя функция вызывается первой. Например, допустим, у меня есть простая функция вывода:

void Output(int a, int b, int c)
{
std::cout << a << "," << b << "," << c << "\n";
}

Тогда я использую это так:

ApplyString(Output, "10 7 5 ");

Ожидаемый результат будет: 10,7,5, Однако фактический результат: 5,7,10, Мне было интересно, если кто-нибудь знает способ помочь мне обойти это. Из того, что я понимаю, кажется, что порядок вызова функции противоположен порядку расширения пакета параметров. Я правильно понимаю?

Заранее спасибо!

2

Решение

Так что я кое-что понял, и хотя это не самое красивое, оно работает. Я сделал функцию для построения кортежа указанного типа из строки, затем я использовал это вместо make_tuple.

Код:

template <typename Head, typename... Tail>
std::tuple<Head, Tail...> StringToTuple(std::tuple<Head, Tail...>, std::string& args)
{
auto head = std::make_tuple(GetToken<Head>(args));
return std::tuple_cat(head, StringToTuple(std::tuple<Tail...>(), args));
}
std::tuple<> StringToTuple(std::tuple<>, std::string& args)
{
return std::tuple<>();
}

template <typename R, typename... Args>
R ApplyString(std::function<R(Args...)> func, std::string args)
{
std::tuple<Args...> argtuple = StringToTuple(std::tuple<Args...>(), args);
return ApplyTuple(func, argtuple);
}

Это работает сейчас, но если у кого-то есть лучшее решение, пожалуйста, опубликуйте его. Ура!

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector