gpt4 book ai didi

c++ - 从另一个模板类填充一个类的模板

转载 作者:行者123 更新时间:2023-11-30 01:28:22 27 4
gpt4 key购买 nike

如果我有两个类:

template <typename T>
struct Node
{
...
};

tempalte <typename T_Node, typename T>
struct NodeIterator
{
T m_value;
};

NodeIterator<Node<int>, int>

我可以从 T_Node 中推导出模板参数 T 而无需类 Node 显式创建这样的 typedef 吗:

// To make it clear, yes I know this works, but I had to typedef the type
template <typename T>
struct Node
{
typedef T node_type;
...
};

template <typename T_Node>
struct NoteIterator
{
typedef typename T_Node::node_type node_type;

node_type m_value;
};

NodeIterator<Node<int> >

如果不是,除了 之外,是否有我不能这样做的原因(编译器已经知道 T_Node 和它接受的类型 T )? C++ 中没有该功能”?我问这个,因为通常有一个很好的理由来解释语言中缺少的一些简单的东西(至少在表面上)。

最佳答案

如果没有 typedef,这是不可能的。关键是编译器不知道 T_Node本身就是一个模板的实例化。 Node<T>只是一个类型,仅此而已。

C++ 知道三层实体:值、类型和模板。 Node是一个模板,Node<T>是一种类型。当您的类模板接受一个type 参数时,您就没有进一步的方法来检查该类型的性质。

通过部分特化进行模式匹配是提取此类信息的唯一方法,而且您不会绕过一些函数元编程。任何类型的检查通常被称为“类型特征”。它会归结为同一件事,与您已经建议的非常相似,但也许这是另一种更通用的方式:

template <typename> struct ClassWithOneArg;

template <template <typename> class C, typename T>
struct ClassWithOneArg<C<T>>
{
typedef T value_type;
};

现在你可以说:typedef typename ClassWithOneArg<T_Node>::value_type type; .

关于c++ - 从另一个模板类填充一个类的模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7585534/

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