如何在C++中对一组自变量应用相同的操作?

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可能会被关闭".我确信这不是基于意见的问题,因为我不是要求比较解决方案,而是建议一些.

und*_*e_d 4

问题似乎是您试图使用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对于这种情况有一个范围样式的“自动取消引用”,但是实现它可能会导致各种语法歧义,当这种方式足够简单时,这并不值得。