c++ - 将两种不同类型的模板定义专门化

标签 c++

我试图通过以下方式专门针对两个不同的类使用相同的模板:

template <>
struct TemplateClass<A> {
  void method(A x) {
    std::cout << x << std::endl;
  }
};

template <>
struct TemplateClass<B> {
  void method(B x) {
    std::cout << x << std::endl;
  }
};

有没有一种方法可以重写此方法以避免两个专门化定义中的重复?

我无法控制TemplateClass的定义。我想到的特定应用是fmt::formatter的特殊化,如下所示:
https://fmt.dev/latest/api.html#formatting-user-defined-types

最佳答案

如果您在struct formatter中查看fmt/core.h的定义,则它具有一个虚拟typename = void参数:

template <typename T, typename Char = char, typename Enable = void>
struct formatter

此伪参数使您可以进行特化的SFINAE:
template <typename T>
struct formatter<T, char, std::enable_if_t<std::is_same_v<T, A> || std::is_same_v<T, B>>>
{
    // ...
};

关于c++ - 将两种不同类型的模板定义专门化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60907372/

相关文章:

c++ - 构造函数中变量的初始化不起作用,而是给我一个随机数

c++ - 取决于整数的宏使用

c++ - 不可避免地调用 abort() 可能会产生什么影响?

c++ - 在 TreeView 中双击后焦点丢失

c++ - __PRETTY_FUNCTION__ 在常量表达式中

c++ - 在 UWP C++ 应用程序中获取 CreateFile() 设备路径的首选方法是什么?

c++ - ActiveMQ 3.8.3 (CPP) priorityBackup 不工作的问题

c++ - 如何删除 vector 中的元素。 (删除无效)

C++ 数组和溢出

c++ - 如何编写线程安全的自动化测试