使用类指针重载C++命名空间函数模板专用化替代方法?
C++ namespaced function template specialization alternative using overloading with class pointer?
所以我遇到了一个问题,即使用函数模板专用化迫使我在与函数模板相同的命名空间中编写函数。我无法执行此操作,因为其他一些代码需要在另一个特定命名空间中定义某些函数模板。
为了解决命名空间问题,我尝试改用函数重载。此外,这些函数返回值需要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]"; }
演示
相关文章:
- 检查子类型时的专用方法模板
- 部分方法专用化
- 基于枚举参数调用专用模板方法
- 类中一种方法的部分专用化
- 从非模板类调用专用模板方法
- 使用类指针重载C++命名空间函数模板专用化替代方法?
- 没有针对完全专用模板类的外联虚拟方法定义
- 从部分专用模板方法调用模板非静态方法
- 添加具有模板专用化的方法
- 常量字符*的模板方法专用化
- 两种专用方法中的相同代码
- C++隐式/显式模板方法专用化问题
- C++复杂类型的单一方法的模板专用化
- enable_if在类声明之外实现的方法专用化
- 模板化类和模板化方法的模板专用化语法
- 获取非专用标准::矢量容器的标准方法<bool>
- 一种安全、符合标准的方法,使类模板专用化仅在实例化时才无法使用"static_assert"进行编译
- boost:enable_if 在模板化类中定义专用方法
- 模板类的专用方法
- 从专用方法捕获异常