- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我想知道用于构建例如元组的经典递归模式是否应该使用一个常规模板参数,或者是否需要两个。这是单参数的情况:
// 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/
所以我有两个分支,假设分支 A 和分支 B 我已将分支 A merge 到分支 B。 git checkout B git merge A 现在我想在命令行中解决有利于分支 A 的差异。我该怎么做?
所以我有两个分支,假设分支 A 和分支 B 我已将分支 A merge 到分支 B。 git checkout B git merge A 现在我想在命令行中解决有利于分支 A 的差异。我该怎么做?
我是一家相对较小的商店中唯一的开发人员,该公司确实制作了大量各种定制应用程序。钱不是这个讨论中的一个因素,所以除此之外,有什么理由支持和反对我使用团队系统。 我们目前严重依赖 VS2008 Pro、V
我是一名优秀的程序员,十分优秀!