这个问题是关于易用性的。我最终的想要是,当我折叠除类主体范围之外的类代码时,我看到和读到的内容尽可能简短和必要,意味着所有属性和成员。
我有一个带有成员模板函数
eval_sub
的类模板,仅在成员函数eval
中使用。虽然删除 eval_sub
存在争议,但 eval
像这样存在有助于 eval_sub
易于阅读。然而,我不喜欢 eval_sub
的定义崩溃后 eval
的可见性——因为 eval_sub
仅与 eval
相关。
template<int n>
struct A{
double x;
template<int k> void eval_sub(){
x+=exp(k);
}
void eval(){
[this]<std::size_t... k>(std::index_sequence<k...>){ (eval_sub<k>(), ...); }(std::make_index_sequence<n>{});
}
};
问题:如何将
eval_sub
隐藏在eval
范围内?
我尝试过的:
eval_sub
的地址放入变量中只是为了调用它。相反,auto lambda 是一种越狱,只是为了防止编译器拒绝函数作用域内的函数定义。eval_sub
前面会破坏成员函数特征,因为在 eval_sub
内的每个属性访问之前,我现在必须抓住 A 的 this
的句柄,这会消除实用性。您如何解决这个常见问题?我目前的解决方案是,我忍受着阅读大约 10 个班级成员时范围崩溃的烦恼,而实际上应该只有大约三个。
PS:我知道该语言禁止什么。我很好奇语言消费者(即观众)如何应对这种困境。在这种情况下,您的典型处理方式是什么?如果答案是“自动 lambda”,那么我屈服。
我认为模板 lambda 是这里最直接/最简单的选择。可以像下面这样使用:
template<int n>
struct A{
double x;
void eval2(){
[this]<std::size_t... k>(std::index_sequence<k...>){ (decltype([]<int i>(){/*do something with x here*/}){}.template operator()<k>(), ...); }(std::make_index_sequence<n>{});
}
};