在另一个主题中,@ Didmar给出了这个解决方案:
template <typename... T>
std::tuple<T...> parse(std::istream& in)
{
return std::tuple<T...>{ T(in)... };
}
Run Code Online (Sandbox Code Playgroud)
说明,
大括号初始化的使用起作用,因为大括号初始化列表中参数的求值顺序是它们出现的顺序.(强调我的)
C++标准(n3485)的相关文本是,
在braced-init-list的initializer-list中,initializer-clauses(包括pack扩展(14.5.3)产生的任何结果)按照它们出现的顺序进行评估.也就是说,与给定初始化子句相关联的每个值计算和副作用在每个值计算和副作用之前与在初始化列表的逗号分隔列表中跟随它之后的任何初始化子句相关联.[注意:无论初始化的语义如何,此评估顺序都保持不变; 例如,当initializer-list的元素被解释为构造函数调用的参数时,它适用,即使通常对调用的参数没有排序约束. - 尾注]
所以我尝试用以下代码测试它:
template<int N>
struct A
{
std::string data;
A(std::istream & stream) { stream >> data; }
friend std::ostream& operator<<(std::ostream & out, A<N> const & a)
{
return out << "A"<<N<<"::data = " << a.data;
}
};
typedef A<1> A1;
typedef A<2> A2;
template<typename ...Args>
void test(std::istream & stream)
{
std::tuple<Args...> args { Args(stream)... }; …Run Code Online (Sandbox Code Playgroud) 如何编写简单的 C++ 代码来简单地运行具有特定展开因子的 for 循环?例如,我需要编写一个 for 循环,将 i 值分配给数组的每个索引,即 A[i]=i 表示数组大小为 1e6。
现在我想添加一个展开因子,假设为 20。我不想手动编写 20 行代码并迭代 5k 次。我该怎么做呢?我是否嵌套了 for 循环?如果我使用模板元编程,编译器会自动为我执行一些展开操作吗?如何手动设置展开因子(当然在编译时固定)?