防止不同数据类型上的重复代码(uint16_t / uint32_t)

时间:2017-10-19 16:17:14

标签: c++

我正在寻找使用函数的可能性,我将指针传递给uint16_t或uint32_t值。

目前我使用了两个重载函数

std::vector<float> calcMap(uint16_t* map)
std::vector<float> calcMap(uint32_t* map)

由于它们返回浮点值,因此16位和32位值的计算相同。唯一的区别是通过指向的数组所需的数据类型。 我不希望两次函数的全部内容,是否有可能使其独立?

2 个答案:

答案 0 :(得分:4)

如果您只想接受uint16_tuint32_t,那么以下内容应该有效:

template <class T,
  class = typename std::enable_if<
    std::is_same<typename std::decay<T>::type, uint16_t>::value || 
    std::is_same<typename std::decay<T>::type, uint32_t>::value>::type>
std::vector<float> calcMap(T * map) {
  // Code
}

您必须#include <type_traits>并至少启用C ++ 11才能实现上述目标。

顺便说一下,如果您的代码只读取数据,那么将T *更改为T const *可能是个好主意。或者地狱,T const * const当你在它的时候。

您可能也对std::is_integral感兴趣,以防您只想允许使用上述两种以上的类型。

答案 1 :(得分:4)

主要是为了完整性:

如果您想要公开函数的实现,并且出于任何原因不想转发到私有模板。经常忽略显式模板实例化声明的选项。这很容易:

  1. 声明模板,并在标题中明确声明其实例化:

    template<typename T> std::vector<float> calcMap(T*);
    extern template std::vector<float> calcMap<>(uint16_t*);
    extern template std::vector<float> calcMap<>(uint32_t*);
    
  2. 在您自己的原始翻译单元中,定义一个模板,并添加两个显式实例化:

    template<typename T>
    std::vector<float> calcMap(T*) {
      // Now we implement
    }
    
    template std::vector<float> calcMap<>(uint16_t*); // Now this will link
    template std::vector<float> calcMap<>(uint32_t*); // As will this
    
  3. 它与drescherjm's excellent suggestion的区别如何?它会产生更少的符号。如果您的编译器在链接时内联方面不太好,则不需要它跳过转发函数。