首页 > 解决方案 > 使用类指针重载的 C++ 命名空间函数模板专业化替代方案?

问题描述

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

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

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

谢谢!

标签: c++templatesnamespacesoverloading

解决方案


您可以改用“标签”:

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

演示


推荐阅读