我正在寻找使用函数的可能性,我将指针传递给uint16_t或uint32_t值。
目前我使用了两个重载函数
std::vector<float> calcMap(uint16_t* map)
std::vector<float> calcMap(uint32_t* map)
由于它们返回浮点值,因此16位和32位值的计算相同。唯一的区别是通过指向的数组所需的数据类型。 我不希望两次函数的全部内容,是否有可能使其独立?
答案 0 :(得分:4)
如果您只想接受uint16_t
和uint32_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)
主要是为了完整性:
如果您不想要公开函数的实现,并且出于任何原因不想转发到私有模板。经常忽略显式模板实例化声明的选项。这很容易:
声明模板,并在标题中明确声明其实例化:
template<typename T> std::vector<float> calcMap(T*);
extern template std::vector<float> calcMap<>(uint16_t*);
extern template std::vector<float> calcMap<>(uint32_t*);
在您自己的原始翻译单元中,定义一个模板,并添加两个显式实例化:
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
它与drescherjm's excellent suggestion的区别如何?它会产生更少的符号。如果您的编译器在链接时内联方面不太好,则不需要它跳过转发函数。