gpt4 book ai didi

另一个命名空间中函数的 C++ ADL

转载 作者:行者123 更新时间:2023-11-30 01:02:19 26 4
gpt4 key购买 nike

我有一个函数模板 printSize 在声明 getSize 之前调用重载函数 getSize。为了让我的程序结构更清晰,我想将两个函数放在不同的命名空间 AB 中,如注释代码行所示。但是,ADL 将无法找到 getSize

实际上,printSizegetSize是在不同的头文件中实现的。因此,我不能放置 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;
}

有没有一种方法可以使此代码在不同命名空间中定义的 printSizegetSize 进行编译?

最佳答案

一种解决方案是将标记放入 B 命名空间,然后将其拉入 A

namespace B {
template <typename T> struct tag {};
}

namespace A {
using B::tag;
}

现在,因为 tag 来自 B 命名空间,它将关联 B 用于 ADL。

关于另一个命名空间中函数的 C++ ADL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56216799/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com