在类声明

时间:2017-03-23 20:04:05

标签: c++ c++11 templates using

说我有以下代码:

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来代替一些非常长的表达。

是否有可能进一步消除这种情况并将<{1}}声明放在类声明之前?显然,以下代码无法编译:

using

但有没有办法写出这种效果?以这种方式生成多个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. }; 声明可能很有用(即在模板范围内但在类声明之前)。

2 个答案:

答案 0 :(得分:3)

我不认为这是一个好主意(对于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;
 }

答案 1 :(得分:2)

您不能在模板之后和课程之前定义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