c++ - 使用类指针重载的 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[]"
。
也许有更好的解决方案来避免函数模板专业化的命名空间地狱?我知道这一切都很臭,但我还找不到更好的选择。
谢谢!
解决方案
您可以改用“标签”:
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]"; }
推荐阅读
- python-3.x - Networkx 中的图联合
- php - 我是 PHP 新手,但在使用响应式电子邮件表单时遇到问题
- python - Pandas 替换每列中的某些值
- javascript - 如何将我的日期转换为适当的格式以执行新的 Date()?
- javascript - 选择下拉选项时如何在Vue中触发功能
- class - c#实现派生类中使用的接口变量
- python-3.x - 在满足 else 条件后重新进入 if 循环 Python3
- javascript - 使用#(使用javascript或jquery)动态地将return false添加到所有锚点
- c# - File.Delete 不会删除我的预取文件
- python - 如何在python中使用生成器查找特定值