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

C++ namespaced function template specialization alternative using overloading with class pointer?

本文关键字:专用 方法 函数模板 命名空间 指针 重载 C++      更新时间:2023-10-16

所以我遇到了一个问题,即使用函数模板专用化迫使我在与函数模板相同的命名空间中编写函数。我无法执行此操作,因为其他一些代码需要在另一个特定命名空间中定义某些函数模板。

为了解决命名空间问题,我尝试改用函数重载。此外,这些函数返回值需要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[]"

也许有更好的解决方案可以避免函数模板专用化的命名空间地狱?我知道这一切都很臭,但我还找不到更好的选择。

谢谢!

你可以改用"tag":

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]"; }

演示