gpt4 book ai didi

使用类指针重载的 C++ 命名空间函数模板特化替代方案?

转载 作者:行者123 更新时间:2023-11-28 04:34:55 25 4
gpt4 key购买 nike

所以我遇到了一个问题,使用函数模板特化迫使我在与函数模板相同的命名空间中编写函数。我不能这样做,因为一些其他代码需要在另一个特定的命名空间中定义一些函数模板。

为了解决命名空间问题,我正在尝试使用函数重载。此外,这些函数的返回值需要是 constexpr,所以我无法使用类引用进行重载,所以我使用了类指针。

所以我最终得到了这个:

template<class T> constexpr auto getName(T* const) { return ""; }

然后我像这样重载它们:

inline constexpr auto getName(int* const) { return "int"; }

这工作正常并允许我使用像这样的 nullptr 技巧调用正确的重载:

auto name = getName((int* const)nullptr);

我的问题是,当类型是数组时,我似乎无法重载它。我希望能够在类型为 int[] 时重载,并在这种情况下返回字符串 "int[]"

也许有更好的解决方案来避免函数模板特化的命名空间 hell ?我知道这一切都很糟糕,但我还找不到更好的选择。

谢谢!

最佳答案

您可以改用“标签”:

template <typename T> struct Tag{};

// template <typename T>
//constexpr auto getName(Tag<T>) { return ""; }

inline constexpr auto getName(Tag<int>) { return "int"; }

inline constexpr auto getName(Tag<int[]>) { return "int[]"; }

template <std::size_t N>
constexpr auto registerName(Tag<int[N]>) { return "int[N]"; }

Demo

关于使用类指针重载的 C++ 命名空间函数模板特化替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51754170/

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