为什么命名空间不能作为模板参数?

28

我理解命名空间不能作为模板参数。请参考问题“基于命名空间专用的模板”

假设有以下代码:

namespace A {
  class Foo;
  class Bar;
}

namespace B {
  class Foo;
  class Bar;
}

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

template<name> class C {
  name::Foo* foo;
  name::Bar* bar;
};
我在想为什么会这样。我知道模板不是结构体,但编译器设计上是否存在技术限制?或者实现这种功能是否存在重大的权衡考虑?

2
有趣。我从来没有需要过这个,但我想我可以有点理解为什么你可能想要它……也许……有时候……另一方面,这真的是我们如何使用命名空间的吗?这就是它们设计的目的吗?不,我不认为是这样的。 - Lightness Races in Orbit
3
这只是属于“不是因为它不是”的范畴。 - Seth Carnegie
2
可能会成为C++1x的一个不错的提案。 - Lightness Races in Orbit
@Lightness Races in Orbit - 顺便说一句,如果您想定义一个模板化的“处理器”或“解码器”,然后将其传递给一个结构体(尽管我更喜欢命名空间),该结构体本质上包装了您想要执行操作的不同版本的结构体,那么这非常有用。 - Alex
1
有人尝试过为此制定标准提案吗? - Stepan Dyatkovskiy
显示剩余3条评论
2个回答

28

在Bjarne Stroustrup首次在C++标准会议上谈论模板时,他提到了命名空间作为模板参数。这引起了怀疑的反应,部分原因是命名空间本身还很新,我们害怕结合两个我们不理解的东西。


18
@windfinder - 我曾是怀疑者之一。 - Pete Becker
4
你并不完全是一个次要来源,对吧?!;-) - Alex
1
@PeteBecker,您是否记得那次会议大约是什么时候,或者更好的是,您是否有关于此的在线对话链接?我正在讨论这个问题,如果可能的话,我想链接到原始的资料来源。 - Catskul
2
@Catskul -- 很抱歉,我无法提供帮助。X3J16的第一次会议是在1990年,未来方向的讨论应该在最初几次会议中进行。 - Pete Becker

15

这将会是:

  1. (在我看来) 不合适的:命名空间可以避免名称冲突,而多态性则超出了它们的职责范围。
  2. 不必要的:使用结构体已经可以实现该方案无法达成的效果。
  3. 可能存在难度:命名空间并不是完整的、独立的实体。同一命名空间的不同成员可以声明在不同的头文件中甚至不同的编译单元中。

10
在被添加到用户定义类型之前,多态性超出了其章程。 - Lightness Races in Orbit
4
我认为你通过第三项已经说明了问题。似乎仅仅这一项就足以使得实施变得棘手且语义荒谬。 - Lightness Races in Orbit
1
除了不必要的之外,您始终可以执行namespace A { struct types { typedef Foo Foo; typedef Bar Bar; }; },然后使用A::types作为模板参数。但我认为1.是最重要的原因(它从未设计用于此用途)。虽然2.决定接受这个作为语言的新功能的价值很小。 - David Rodríguez - dribeas
1
@LightnessRacesinOrbit:我同意第1点本身并不是一个强有力的论据,但当你考虑第2点时,它就会获得实质性的支持。 - Marcelo Cantos
  1. 当你开始使用using namespace命令时,命名空间冲突会经常出现。
  2. 本来就不需要命名空间,你可以使用类或者前缀 - 都可以工作。
  3. 我不明白困难在哪里;毕竟这只是一种光荣的复制粘贴。确实,如果你在模板参数中使用命名空间一次,而在另一次不使用,就会发生冲突,但这对于类也是如此,本质上是一样的。
- einpoklum
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接