在 class 声明之前在模板内进行 `using` 声明

Making `using` declaration inside template before class declaration

假设我有以下代码:

template<typename X, typename Y, typename Z>
class Foo : public Parent<SomeComplicatedExpressionInvolving<X,Y,Z>> {
  using Useful = SomeComplicatedExpressionInvolving<X,Y,Z>;

  Useful member;
  Useful another_member;
  Useful f(Useful x) { return x; } // etc.
};

Useful 声明在这里很有用,因为它允许我们写 Useful 来代替一些非常长的表达式。

是否可以进一步整理并将 using 声明 放在 class 声明之前?显然,以下代码无法编译:

template<typename X, typename Y, typename Z>
using Useful = SomeComplicatedExpressionInvolving<X,Y,Z>
class Foo : public Parent<Useful> {      
  Useful member;
  Useful another_member;
  Useful f(Useful x) { return x; } // etc.
};

但是有没有办法写一些这样的东西?以这种方式进行多个 using 声明可能很有用(即在模板范围内但在 class 声明之前)。

您不能在模板之后和 class 之前定义 using。但是,您可以使用两个 using 类型别名

来清理您所做的事情
template<typename X, typename Y, typename Z>
using Useful_t = SomeComplicatedExpressionInvolving<X,Y,Z>;

template<class X, class Y, class Z>
class Foo : public Parent<Useful_t<X, Y, Z>> {
  using Useful = Useful_t<X, Y, Z>;
  Useful member;
  Useful another_member;
  Useful f(Useful x) { return x; } // etc.
};

Live Demo

我认为这不是一个好主意(AndyG 的解决方案 +1)但是...只是为了好玩...您可以使用具有默认值的模板类型而不是 using

举例

template <typename, typename, typename>
struct SomeComplicatedExpressionInvolving
 { };

template <typename>
struct Parent
 { };

template <typename X, typename Y, typename Z,
          typename Useful = Parent<SomeComplicatedExpressionInvolving<X,Y,Z>>>
class Foo : public Useful
 {
   Useful member;
   Useful another_member;
   Useful f(Useful x) { return x; } // etc.
 };

int main ()
 {
   Foo<int, long, int> f;
 }