C ++模板别名?

时间:2016-05-03 17:02:45

标签: c++ templates alias

我尝试为模板创建别名,而不是类型,我无法找到执行此操作的语法。下面是一个演示我的问题的示例。我的猜测是,这只是无法完成的事情,但我希望有人可以证明我是错的。如果不能这样做,是否有一些潜在的原因导致这样做没有意义,或者它是否只是没有实现?

template <class S>
class Down;

template <class S>
class Up {
    template <class S1>
    using Opposite = Down<S1>;
};

template <class S>
class Down {
    template <class S1>
    using Opposite = Up<S1>;
};

template <template <typename> class Direction>
void oneDirection() {
    //Call another function here that uses the template argument as a template
}

template <template <typename> class Direction>
void bothDirections() {
    oneDirection<Direction>();
    oneDirection<Direction::Opposite>();  //This doesn't compile
}

int main() {
    bothDirections<Up>();
}

1 个答案:

答案 0 :(得分:3)

Direction::Opposite中,Direction::嵌套名称说明符,它确实无法表示类模板(您需要给它提供所需的模板参数,使其成为模板特化)。

我认为不允许该形式的一个原因是类模板可以具有部分或显式特化,这可以提供与主模板不同的成员,因此编译器需要使用特定的特化才能够确切地知道什么和#39;在那里可用。

您可以通过使用特征来关联这两个模板来解决这个问题:

template<class> class Up { };
template<class> class Down { };

template<template<class> class Direction> struct Direction_traits;

template<> struct Direction_traits<Up>
{
   template<class S1> using Opposite = Down<S1>;
};

template<> struct Direction_traits<Down>
{
   template<class S1> using Opposite = Up<S1>;
};

template<template<class> class Direction>
void oneDirection() {
   //Do something here
}

template<template<class> class Direction>
void bothDirections() {
   oneDirection<Direction>();
   oneDirection<Direction_traits<Direction>::template Opposite>();
}

int main() {
   bothDirections<Up>();
}

但是,请注意,Direction_traits<Up>::OppositeDown不是同一个模板,至少现在还没有 - 语言规则将来可能会发生变化,this answer及其更多细节评价。

如果您想使用特征从Up内部返回oneDirection<Direction_traits<Up>::Opposite>,这可能会导致问题 - 不会为别名模板定义特征专长。要允许这样的使用,事情需要更复杂一些;在上面引用的答案中概述了一种可能的解决方案。