对模板参数使用隐式命名空间
Use implicit namespace on template arguments
示例代码
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>();
但我觉得这有点奇怪。
所以有人知道是否存在无宏的解决方案吗?
这样的解决方案并不存在:
模板类型参数既不建立自己的作用域,也没有任何类似ADL的查找规则。此外,您不能向它传递任何任意的令牌,但您需要向它传递一个类型。
因此,无论你通过什么,都必须在你呼叫的周围范围内找到。您可以限定它,也可以通过using
/typedef
指令将它拉入周围的一个命名空间中。
虽然ADL似乎是一个可行的替代方案(如果你添加了一个参数),这意味着你手头有一些东西,其类型将使ADL达到预期的结果。需要注意的是,在这种情况下,您只是在这个范围内的其他地方编写了类型,您可以使用decltype
(可能还有一点type_traits
的魔力)重用它。
附言:虽然宏可以实现所需的结果(通过建立一个额外的作用域并在该特定作用域中插入using namespace指令,或者通过准备一个完整的限定),但你显然不想要。
相关文章:
- 命名空间中具有.h和.cpp文件的类
- 有关命名空间和模板参数的名称的问题
- 运算符<<依赖于参数的查找不在全局命名空间中查找
- 在模板参数的函数中使用一个命名空间或另一个命名空间
- 命名空间和类中的可变参数模板函数
- 函数与来自未命名命名空间的参数的链接
- 让我们C++推断定义参数的类/命名空间的位置
- 对命名空间和函数参数的好奇心
- 为什么在语句"std::cout << std::endl;"中使用时需要命名空间限定,给定依赖于参数的查找?
- C++:在函数参数列表中使用或不使用命名空间
- 依赖于参数的查找在来自另一个命名空间的别名类型上意外行为
- 依赖于参数的名称查找:添加要查找的额外命名空间
- 如何在类命名空间中使用常量作为数组和模板参数
- ADL 不考虑与模板参数关联的命名空间吗?
- 如果存在具有不同参数类型的重载,则在全局命名空间中找不到函数
- C++ 命名空间解析("automatic using"基于参数?
- 顶级命名空间中类的参数依赖查找
- 来自不同命名空间的模板-模板参数可以是朋友吗
- 对模板参数使用隐式命名空间
- 基于模板参数的动态命名空间使用