gpt4 book ai didi

c++ - 可变参数模板类的部分特化是否应该有利于非可变特化

转载 作者:搜寻专家 更新时间:2023-10-31 00:40:13 25 4
gpt4 key购买 nike

我想知道用于构建例如元组的经典递归模式是否应该使用一个常规模板参数,或者是否需要两个。这是单参数的情况:

// Forward declaration of main tuple class template.
template<typename... Ds> class Tuple;

// Tuple class specialization for the general case
template<typename D, typename... Ds> class Tuple<D, Ds...> {
public:

typedef D HeadType;
typedef Tuple<Ds...> TailType;

Tuple() {}

Tuple(const D& head, const Ds&... ds) : mHead(head), mTail(ds...) {}

HeadType mHead;
TailType mTail;
};

// Sentinel one element case
template<typename D> class Tuple<D> {
public:
typedef D HeadType;

Tuple() {}
Tuple(const D& d) : mHead(d) {}

HeadType mHead;
};

在这里您可能会争辩说,当使用一个模板参数实例化(直接或在递归中)时:Tuple<int>这两个专业都是有效的,声明应该是模棱两可的。但是,VS2012 Nov CTP 接受了这段代码,所以我不知道它是否可以,或者编译器是否很好。我无法在标准文本中找到任何提到这种情况的段落,但它编译肯定很方便,并且在某种程度上合乎逻辑,“更具体”的非可变特化获胜。

现在,如果这不适合 C++11,下面的代码是一个替代方案,使用两个常规模板参数,这样 1 个参数的情况就不能选择通用特化:

// Forward declaration of main tuple class template.
template<typename... Ds> class Tuple;

// Tuple class specialization for the general case
template<typename D, typename D2, typename... Ds> class Tuple<D, D2, Ds...> {
public:

typedef D HeadType;
typedef Tuple<D2, Ds...> TailType;

Tuple() {}

Tuple(const D& head, const D2& d2, const Ds&... ds) : mHead(head), mTail(d2, ds...) {}

HeadType mHead;
TailType mTail;
};

// Sentinel one element case
template<typename D> class Tuple<D> {
public:
typedef D HeadType;

Tuple() {}
Tuple(const D& d) : mHead(d) {}

HeadType mHead;
};

遗憾的是,这不会在 VS2012 Nov CTP 上编译,但这肯定是一个错误:当使用两种类型调用第一个特化时,对 mTail 的 ctor 调用不理解空参数包是空的...

所以主要问题仍然是:第一个版本是否有效的 C++?

如果有人可以指出我在第二种选择中的错误,请指出!

最佳答案

Here you could argue that when instantiated (directly or in the recursion) with one template parameter: Tuple<int> that both specializations are valid and the declaration should be ambiguous.

按照现在的标准,没错,这确实应该是有歧义的。参见 this defect report .然而,委员会表示非可变变体的排名要高于可变变体,甚至依赖当前标准中的这一点。我会方便地链接 to another answer of mine其中包含一个示例。

现在,基本上所有好的编译器都已经实现了这个 DR 的解决方案,他们必须这样做,否则 std::common_type将被简单地破坏(如果按指定定义)。所以,是的,从某种意义上说,编译器对你很好,但这是有充分理由的。

This, sadly, does not compile on VS2012 Nov CTP, but that is surely a bug

是的,这是一个错误,众所周知,11 月的 CTP 非常错误。当我玩弄它时,那天晚上我提交了 11 个可变参数错误(我想还有 3 个 decltype 错误)。

关于c++ - 可变参数模板类的部分特化是否应该有利于非可变特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15122854/

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