gpt4 book ai didi

模板的 C++ 别名?

转载 作者:搜寻专家 更新时间:2023-10-31 01:35:37 27 4
gpt4 key购买 nike

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

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>();
}

最佳答案

Direction::Opposite , Direction::是一个nested-name-specifier,它确实不能表示一个类模板(您需要给它提供所需的模板参数以使其成为模板特化)。

我想不允许这种形式的一个原因是类模板可以有部分或显式特化,它可以提供与主模板不同的成员,所以编译器需要使用特定的特化才能准确知道是什么在那里可用。

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

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>使用特征 - 不会为别名模板定义特征特化。事情需要变得更复杂一些才能允许这样的使用;上面引用的答案中概述了一个可能的解决方案。

关于模板的 C++ 别名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37010136/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com