浮点的 C++ 模板特化

标签 c++ templates c++17 template-specialization specialization

我想为浮点类型特化类 X 的方法。 以下代码编译并完美运行:

x.hpp:

template <typename T>
class X {
 public:
  ...
  T bucket_width(const BucketID index) const;
  T bucket_min(const BucketID index) const;
  T bucket_max(const BucketID index) const
  ...
};

x.cpp:

...

template <typename T>
T X<T>::bucket_width(const BucketID index) const {
  return bucket_max(index) - bucket_min(index) + 1;
};

template <>
float X<float>::bucket_width(const BucketID index) const {
  return bucket_max(index) - bucket_min(index);
};

template <>
double X<double>::bucket_width(const BucketID index) const {
  return bucket_max(index) - bucket_min(index);
};

...

现在,与此类似 answer我将 cpp 文件更改为:

template <typename T>
T X<T>::bucket_width(const BucketID index) const {
  return bucket_max(index) - bucket_min(index) + 1;
};

template <typename T>
std::enable_if_t<std::is_floating_point_v<T>, T> X<T>::bucket_width(const BucketID index) const {
  return bucket_max(index) - bucket_min(index);
};

不幸的是,这会导致以下编译器错误:

.../x.cpp:46:56: error: return type of out-of-line definition of 'X::bucket_width' differs from that in the declaration
std::enable_if_t<std::is_floating_point_v<T>, T> X<T>::bucket_width(const BucketID index) const {
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~                       ^

有人可以向我解释我缺少什么吗?
提前致谢!

编辑:我们在cpp文件的末尾显式实例化模板类,这样我们就可以在cpp文件中做模板代码。

最佳答案

Can someone explain to me what I am missing?

错误解释:

.../x.cpp:46:56: error: return type of out-of-line definition of 'X::bucket_width' differs from that in the declaration

也就是说,函数被声明为返回一个T。但您将其定义为返回 std::enable_if_t<std::is_floating_point_v<T>, T> .那些不匹配并且需要。

更一般地说,您要做的是部分特化函数模板,这是不可能的。

一个简单的解决方案是使用 if constexpr :

template <typename T>
T X<T>::bucket_width(const BucketID index) const {
  if constexpr (std::is_floating_point_v<T>) {
    return bucket_max(index) - bucket_min(index);
  } else {
    return bucket_max(index) - bucket_min(index) + 1;
  }
};

关于浮点的 C++ 模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50513684/

相关文章:

c++ - 如何使用提取将不可复制元素从 std::set move 到 std::map?

c++ - regex_search 只选择匹配的最大子串。还要在 regex_search 中键入不匹配

wpf - 连续填充的 ListView 未虚拟化

javascript - CX509CertificateRequestPkcs10 对象上的 InitializeFromPrivateKey() 中的模板参数在尝试特定模板时导致异常

c++ - 自动模板参数、数据成员和常量

c++ - c-style this 或 shared_from_this 作为函数参数

c++ - 如何获得堆栈排序的正确输出

c++ - Visual Studio 2015 错误 C4996 'std::_Copy_impl' : Function call with parameters that may be unsafe

c++ - 如何从 C++ 中的集合中检索多个继承类型?

c++ - 在模板类中实现和调用静态方法