对模板参数使用隐式命名空间

Use implicit namespace on template arguments

本文关键字:命名空间 参数      更新时间:2023-10-16

示例代码

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指令,或者通过准备一个完整的限定),但你显然不想要。