iks*_*nov 5 c++ arrays foreach tuples c++11
编辑完全忘记提到对我来说很明显的smth:
a_func()要修改的var_xxx,所以使用的是迭代的解决方案const类型不能完全令人满意(虽然他们的想法带来,肯定).
我觉得答案很简单却找不到.
鉴于:
用户类类型(精确地,数学向量对象)的变量(少数,如6,8,10),其中每个变量必须具有由算法定义的唯一名称(以便进行计算)然后独立使用,并能够轻松查阅代码所基于的论文)
做:
在一段代码中,计算并初始化这些变量,并按名称引用它们; 然后在另一段代码中,在扫描中对它们执行操作,而不必复制调用每个变量的操作(即函数)的代码.
代码是这样的:
// in a class declaration
vector_type var_abc, var_efg, var_xyz;
// in a class member function
// "some_math_xxx" pieces are coded inline, not as separate functions
var_abc = /* some_math_abc */;
var_efg = /* some_math_efg */ ;
var_xyz = /* some_math_xyz */ ;
a_func(var_abc); a_func(var_efg); a_func(var_xyz);
Run Code Online (Sandbox Code Playgroud)
我的意思是,我当然可以打a_func(var_xxx)六次或更多次.但是,它对我来说是错的.
想到:
std::array<>指向vars的指针(有点笨拙但有效)此代码无法编译:
for (vector_type& vr : { var_abc, var_efg, var_xyz }) { a_func(vr); }
(错误:binding const vector_type to reference of type vector_type&)
你怎么解决这个问题?当然,我更喜欢优雅的解决方案.标准更好的只是C++ 11,虽然C++ 14也可以,如果它能够为这个问题提供超级可爱的解决方案.
PS输入表格的问题是"标题是主观的,Q可能会被关闭".我确信这不是基于意见的问题,因为我不是要求比较解决方案,而是建议一些.
问题似乎是您试图使用const复制到隐式的值来初始化引用initializer_list。与所有其他容器一样,此容器不能包含引用。因此,相反,您会获得const值,因为initializer_list(当前?可能永远)只const向其成员提供访问权限。
所以...只需使用指向元素的指针。他们不值得害怕。这看起来很简单:
for ( auto const it: /* std::initializer_list<VecType *> */ {&vecA, &vecB, &vecC} ) {
doStuff(*it);
// N.B. it is a *const, not a const *const!
}
Run Code Online (Sandbox Code Playgroud)
您不需要显式指定initializer_list类型,只要您不使用各种多态指针类型的元素或需要转换的operator元素(在这种情况下,您就需要这样做)。
除非我遗漏了一些东西,否则其他人关于将所有内容都放在额外层的建议std::reference_wrapper似乎是一个不必要的跳过的箍,只是为了避免出于某种原因的指针。其他解决方案可能会调用副本,这可能会导致很多混乱。
我有点希望 C++for对于这种情况有一个范围样式的“自动取消引用”,但是实现它可能会导致各种语法歧义,当这种方式足够简单时,这并不值得。