c++ - 另一个命名空间中函数的 C++ ADL
问题描述
我有一个在声明之前printSize
调用重载函数的函数模板。为了使我的程序结构更清晰,我想将这两个函数放在不同的名称空间中,并且正如注释的代码行所示。但是,ADL 将无法找到.getSize
getSize
A
B
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
命名空间,所以它将B
为 ADL 关联。
推荐阅读
- excel - 类模块到对象,标准模块
- python - Python:在几次连续调用后,对 InfluxDB 的查询速度变慢
- python - QNetworkAccessManager 进程以退出代码 139 结束(被信号 11 中断:SIGSEGV)
- maven - 自定义插件的源代码中是否指定了目标?
- python - 如何在同一格式规范中一个接一个地添加一个字符/字符串
- python - 多输出回归器和 sklearn 的 RFE 模块
- python - 找不到 Statsmodel.varmax 应用或附加
- javascript - 如何从一个公共方法中提取变量的值并调用另一种方法
- powershell - 需要根据成本管理 API 查找资源组支出的总计
- makefile - 编写通用 make 目标时,如何仅使用两个目录之一中的文件?