在 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.
};
我认为这不是一个好主意(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;
}
假设我有以下代码:
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.
};
我认为这不是一个好主意(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;
}