c++ - 使用命名空间作为模板参数的替代方法

标签 c++ templates c++98

我知道我不能将命名空间用作模板参数。但是,我正在尝试实现与此类似的行为:

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/

相关文章:

c++ - 使用模板将一组成员函数声明为友元

c++ - C++哈希程序中的 undefined symbol 错误

c++ - 在 gcc 中执行 C++98 标准

c++ - 从基方法获取派生类

c++ - 如何将 tstringstream 的内容传递给接受 LPTSTR 的方法?

c++ - 模板函数中的 volatile 类型推导有什么问题?

c - 替换运算符 new 和删除似乎会影响 C 库

c++ - IBM WebSphere MQ 在 Windows 上支持 64 位客户端吗?

C++ 模板,静态函数特化

c++ - int a=int(); C++98 中会发生什么?