我写了一个模板,它接受一个istream&
和一个函数,应该从 中提取这个函数的所有参数,istream
用这些参数调用函数并返回结果。一切正常,除了函数参数的评估顺序。请参阅下面的代码、更多详细信息和最后一个问题:
#include <iostream>
#include <vector>
void Foo(int i, std::string s)
{
std::cout << "input was " << i << " and " << s << '\n';
}
template<typename T>
T Parse(std::istream &s)
{
T res;
s >> res;
return res;
}
template<typename TR, typename ... TArgs>
TR Bar(std::istream &s, TR f(TArgs...) )
{
return f(Parse<TArgs>(s)...);
}
int main()
{
Bar(std::cin, Foo);
}
输入:
1 2
预期输出:
input was 1 and 2
实际输出:
input was 2 and 1
我知道函数参数的评估是特定于实现的,显然这里最后一个参数首先被评估并读取第一个输入。
如何修复此代码并强制对参数进行特定的评估顺序?也许在调用函数之前单独评估它们?在不违反标准和/或依赖特定实现或编译器的情况下是否有可能?