【发布时间】:2014-04-28 22:11:15
【问题描述】:
示例代码
namespace many {
namespace namespaces {
class Bar {
};
template<typename T>
void foo() {
}
}
}
除了使用模板参数 Bar 调用 foo 之外没什么特别的了(如果没有 using 指令处于活动状态)来编写
many::namespaces::foo<many::namespaces::Bar>();
当我知道所有允许的类型都在命名空间many::namespaces 中时,这感觉有点傻。所以我的问题是,是否有某种方法可以在正确的命名空间中隐式查找 Bar?这样我就可以写了
many::namespaces::foo<Bar>();
这会非常方便,尤其是在我有多个模板参数要传递的情况下。我知道 ADL 会允许
foo<many::namespaces::Bar>();
但这对我来说有点奇怪。
那么有人知道是否存在针对此问题的无宏解决方案吗?
【问题讨论】:
-
使用
using语句(using namespace <namespace>或using = <type>可以)。 -
这个想法是不使用 using 指令。我想要一个 using 指令之类的东西,它只对函数调用有效。
-
实际上,ADL 仅适用于采用该用户定义类型的参数的函数。它不允许你所说的调用语法。
-
AFAIK 我认为不使用宏或某种类型的别名就不可能做到这一点。
-
啊,是的 - 写这篇文章时犯了一个错误。考虑创建一个作为非模板参数传递的“标签”类型,因此模板参数被推导出 => ADL 工作
标签: c++ templates namespaces metaprogramming template-meta-programming