如何针对非类型模板参数的类型考虑ADL

问题描述

我想在函数调用中查找非类型模板参数名称空间中的函数

例如:

template<auto& N>
struct test_nontype {
    int call() {
        return f(*this);  // error: 'f' was not declared in this scope
    }
};

template<typename T>
struct test_type {
    int call() {
        return f(*this);  // ok,f is found in ns via ADL
    }
};


namespace ns {
    static struct type_in_ns {} value;
    int f(test_nontype<value>) {
        return 3;
    }
    int f(test_type<type_in_ns&>) {
        return -3;
    }
}

int main() {
    int x = test_type<ns::type_in_ns&>{}.call();
    return x + test_nontype<ns::value>{}.call();
}

使用类型可以正常工作,但是由于找不到int ns::f(test_nontype<ns::value>),因此最后一行无法编译。

如果有其他选择,我宁愿不添加参数template<auto& N,typename = decltype(N)> struct test_nontype {,因为添加了模板参数,这只会使接口更加混乱(我必须添加注释来说明它适用于ADL,但是IDE仍然建议添加类型名称,这还会增加更多的噪音来编译错误

还有其他解决方法吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)