【问题标题】:Why can't namespaces be template parameters?为什么命名空间不能是模板参数?
【发布时间】:2012-10-16 23:46:57
【问题描述】:

我了解命名空间不能是模板参数。看到问题,"template specialized on a namespace"

给定:

namespace A {
  class Foo;
  class Bar;
}

namespace B {
  class Foo;
  class Bar;
}

我想在命名空间 AB 上对一个类进行模板化,以便以下工作:

template<name> class C {
  name::Foo* foo;
  name::Bar* bar;
};

我想知道为什么会这样。我知道模板不是结构,但是编译器的设计是否存在技术限制?还是在实现此功能时需要做出重大权衡?

【问题讨论】:

  • 有趣。我从来不需要这个,但我想我可以明白你为什么想要它......也许......有时............另一方面,这真的是 我们如何使用命名空间?这是他们的设计目的吗?不,我不这么认为。
  • 这只是属于“不是因为不是”的范畴。
  • 可能会为 C++1x 提出一个很好的建议。
  • 您的C 模板中缺少几个typename 关键字。
  • 有人尝试为它制定标准提案吗?

标签: c++ templates namespaces language-design


【解决方案1】:

当 Bjarne Stroustrup 在 C++ 标准会议上第一次开始谈论模板时,他提到命名空间作为模板参数。反应持怀疑态度,部分原因是命名空间本身太新了,我们害怕将两个我们不理解的东西结合起来。

【讨论】:

  • @windfinder - 我是怀疑论者之一。
  • 你不完全是次要来源,是吗?! ;-)
  • @PeteBecker 你有没有机会记得那次会议是什么时候举行的,或者甚至更好,有一个关于它的在线对话的链接?我正在讨论并希望尽可能链接到原始源材料。
  • @Catskul -- 抱歉,我帮不上忙。 X3J16 的第一次会议是在 1990 年,关于未来方向的讨论应该在最初的几次会议上。
【解决方案2】:

这将是:

  1. (IMO) 不恰当:命名空间避免名称冲突。多态性超出了他们的规定。
  2. 不必要的:它不会实现任何结构已经无法完成的事情。
  3. 可能很困难:命名空间不是一个完整的、自包含的实体。命名空间的不同成员可以在不同的头文件甚至不同的编译单元中声明。

【讨论】:

  • 多态性在用户定义类型的章程之外,直到它被添加到它们中。
  • 不过,我认为您在第 3 项中获得了成功。似乎仅此一项就会使实现变得难以处理,并且语义变得毫无意义。
  • 添加到不必要的:你总是可以做namespace A { struct types { typedef Foo Foo; typedef Bar Bar; }; }然后使用A::types作为模板参数。但我觉得 1. 是最重要的原因(它从未设计用于此用途)。虽然 2. 确定接受它作为语言的新特性没有什么价值。
  • @LightnessRacesinOrbit:我同意第 1 项本身并不是一个强有力的论据,但是当您将第 2 项考虑在内时,它会获得很大的权重。
  • 我可以理解 1 和 2 的论点,但我一直认为,如果某件事有意义,它应该被允许(在规则范围内允许),所以我觉得 2 很弱。 3是真正有趣的问题。我觉得这在编译时很容易实现,但在链接时可能无法实现?
猜你喜欢
  • 2020-08-07
  • 1970-01-01
  • 2015-05-13
  • 1970-01-01
  • 1970-01-01
  • 2021-01-08
  • 2021-02-10
  • 1970-01-01
相关资源
最近更新 更多