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

时间:2018-08-08 19:20:17

标签: c++ templates namespaces overloading

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

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

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

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以改用“标签”:

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