C++另一个命名空间中函数的 ADL
C++ ADL of a function in another namespace
我有一个函数模板printSize
在声明getSize
之前调用重载函数getSize
。为了使我的程序结构更清晰,我想将这两个函数放在不同的命名空间中A
和B
,如注释的代码行所示。但是,ADL 将无法找到getSize
。
实际上,printSize
和getSize
在不同的头文件中实现。因此,我不能提出using namespace
指令。
#include <array>
#include <iostream>
#include <string>
namespace A {
template <typename T> struct tag {};
template <typename T>
void printSize(const T &data)
{
size_t data_size = getSize(data, tag<T>{});
//size_t data_size = B::getSize(data, tag<T>{});
std::cout << "Size: " << data_size << std::endl;
}
//} // namespace A
//namespace B {
constexpr size_t getSize(const int &, tag<int>)
{
return sizeof(int);
}
size_t getSize(const std::string &str, tag<std::string>)
{
return str.size();
}
template <typename T, size_t N>
size_t getSize(const std::array<T, N> &array, tag<std::array<T, N>>)
{
size_t array_size = 0;
for (const T &element : array)
array_size += getSize(element, tag<T>{});
return array_size;
}
} // namespace A/B
int main()
{
int a;
A::printSize(a);
std::array<std::string, 2> arr = {{"foo", "foobar"}};
A::printSize(arr);
return 0;
}
有没有办法使此代码编译,并在不同的命名空间中定义printSize
和getSize
?
一种解决方案是将标签放入B
命名空间中,然后将其拉入A
中。
namespace B {
template <typename T> struct tag {};
}
namespace A {
using B::tag;
}
现在,由于tag
来自B
命名空间,因此它将关联 ADL 的B
。
可以使用using
声明从另一个命名空间引入名称。例如:
template <typename T>
void printSize(const T &data)
{
using B::getSize;
std::size_t data_size = getSize(data, tag<T>{});
std::cout << "Size: " << data_size << std::endl;
}
getSize
取决于模板参数T
,因此 ADL 将在查找的第二阶段(当此模板实例化时)用于查找用户提供的其他getSize
。在这里,B::getSize
应该在printSize
之前声明,tag
本身似乎是多余的。
相关文章:
- 函数中的 c++ using 语句,后跟函数名称(对于 ADL?
- 为什么 ADL 的运算符函数行为与其他函数不同?
- 函数-本地枚举声明和 ADL 的交互
- 两阶段函数模板编译:第二阶段不是只使用*ADL吗
- 是否可以获取将根据 ADL 调用的函数的 decltype?
- 为什么 ADL 不能使用 std::get 解析为正确的函数
- ADL 找不到重载函数
- ADL 在 constexpr 函数中不起作用(仅限 clang)
- 带有 std::function 的 ADL:可以通过 std::function 参数列表中的类型找到采用 std::function 对象的函数吗?
- ADL 失败(或未完成?)具有附加(非推导)模板参数的函数
- C++另一个命名空间中函数的 ADL
- 类(模板)成员函数体内部的ADL查找
- ADL找不到模板化的自由函数
- 为什么 ADL 优先于'std namespace'中的函数,但等于用户定义命名空间中的函数?
- 在 ADL、"local" 或全局命名空间以外的命名空间中定义函数
- 为什么函数乐趣不符合 ADL 的条件
- 如何在仍然允许 ADL 等的同时调用具有相同名称的其他函数
- 如何使函数模板在ADL期间的优先级最低
- C++ ADL 在具有模板函数的嵌套命名空间中
- 模板化函数名查找难题(ADL)