Итак, у меня есть простая проблема, которая оказывается намного сложнее, чем я ожидал.
Код:
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
, Мне было интересно, если кто-нибудь знает способ помочь мне обойти это. Из того, что я понимаю, кажется, что порядок вызова функции противоположен порядку расширения пакета параметров. Я правильно понимаю?
Заранее спасибо!
Так что я кое-что понял, и хотя это не самое красивое, оно работает. Я сделал функцию для построения кортежа указанного типа из строки, затем я использовал это вместо 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);
}
Это работает сейчас, но если у кого-то есть лучшее решение, пожалуйста, опубликуйте его. Ура!
Других решений пока нет …