我知道我不能将命名空间用作模板参数。但是,我正在尝试实现与此类似的行为:
template <typename T>
void foo(T::X* x)
{
T::bar(x);
}
除了 T 是命名空间而不是结构或类。实现与我期望的结果最相似的最佳方法是什么?
最佳答案
Except T is a namespace rather than a struct or a class. What is the best way to achieve the most similar result to what I am expecting?
根本不要提到T
。
template <typename X>
void foo(X* x)
{
bar(x);
}
ADL将始终从定义 X
的命名空间中获取重载。让机制发挥作用。
现在,如果您要问如何让编译器偏爱 ADL 找到的函数,那都是关于操纵重载决议的。我们可以通过限制常规非限定名称查找所拾取的内容来做到这一点:
namespace foo_detail {
void bar(...);
template<typename X>
void foo_impl(X* x) {
bar(x);
}
}
template <typename X>
void foo(X* x)
{
foo_detail::foo_impl(x);
}
当 foo_detail::foo_impl
中的调用试图解析 bar
时,两阶段查找的第一阶段将选取 C 变量参数函数。现在查找停止,不再查找封闭的命名空间。这意味着只有 ADL 可以提供更多候选者。由于重载决议的工作方式,像我们添加的 C 风格变量参数函数将比 ADL 找到的任何东西更糟糕。
这是一个 live example所有这些都在工作中。
关于c++ - 使用命名空间作为模板参数的替代方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55612759/