首页 > 解决方案 > 有没有办法在数据成员上使用 decltype 来声明方法参数

问题描述

考虑一些简单的代码:

struct A {
  using Type = int;
};

struct B  {
  void test( A::Type i ) { printf("%d\n", i); }
  A a;
};

然而,在实际示例中,“A”是一个长长的模板类型,键入起来并不有趣。即使我确实需要输入它(声明它),我也不想输入两次。即使我在这两个地方都做对了,这是可以改变的,所以这将是一个令人头疼的维护问题。

所以,问题是,如何在不明确提及“A”的情况下向 B::test 声明参数?

我试过这样的事情:

void test( decltype(a)::Type )

但这不起作用,因为“a”没有在声明的范围内声明。如果我使用 decltype(B::a),我会得到 B 不完整的错误。

有没有办法做到这一点?

标签: c++decltype

解决方案


在这些情况下,请创建别名。然后,您可以在类中的任何地方使用它——即使是在声明 时a,您也不需要重新组织类定义中的成员。

struct a_long_template_type_that_is_not_fun_to_type {
  using Type = int;
};

struct B {
  using type_alias = a_long_template_type_that_is_not_fun_to_type;
 
  void test( type_alias::Type i ) { printf("%d\n", i); }
  type_alias a;
};

推荐阅读