说我有以下代码:
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.
};
声明可能很有用(即在模板范围内但在类声明之前)。
答案 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.
};