Итак, у меня есть простая проблема, которую оказалось намного сложнее решить, чем я ожидал.
Код:
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
. Мне было интересно, знает ли кто-нибудь способ помочь мне обойти это. Насколько я понимаю, кажется, что порядок вызова функций противоположен порядку расширения пакета параметров. Я правильно понимаю?
Заранее спасибо!
=
, посколькуstd::tuple
конструкторыexplicit
. list может содержать разнородные типы, пусть вас не обманывают все однородные типы вstd::
. - person K-ballo   schedule 04.12.2013ApplyTuple
, который делает то, что он говорит Ошибка также может быть скрыта там или в генерации индекса (GetIndexTuple
), или вGetToken
. - person dyp   schedule 04.12.2013