如何在成员函数作用域内定义成员函数?

问题描述 投票:0回答:1

这个问题是关于易用性的。我最终的想要是,当我折叠除类主体范围之外的类代码时,我看到和读到的内容尽可能简短和必要,意味着所有属性和成员。

我有一个带有成员模板函数

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
范围内?

我尝试过的:

  • auto lambda 显然有效,但我出于几个原因拒绝它。 1) auto 不明确。 2)显式化是没有帮助的,不是因为指针术语中的语言疾病,而是因为一个重要的事实是,永远不需要这样的指针(又名“lambda”)。典型的例子是,我不需要将
    eval_sub
    的地址放入变量中只是为了调用它。相反,auto lambda 是一种越狱,只是为了防止编译器拒绝函数作用域内的函数定义。
  • 将 struct static 放在
    eval_sub
    前面会破坏成员函数特征,因为在
    eval_sub
    内的每个属性访问之前,我现在必须抓住 A 的
    this
    的句柄,这会消除实用性。

您如何解决这个常见问题?我目前的解决方案是,我忍受着阅读大约 10 个班级成员时范围崩溃的烦恼,而实际上应该只有大约三个。

PS:我知道该语言禁止什么。我很好奇语言消费者(即观众)如何应对这种困境。在这种情况下,您的典型处理方式是什么?如果答案是“自动 lambda”,那么我屈服。

c++ templates
1个回答
0
投票

我认为模板 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>{});
  }
};

工作演示

© www.soinside.com 2019 - 2024. All rights reserved.