C++17及更早版本如何实现支持混合入参的单个compute模板函数
问题解答
可以实现,仅需单个模板即可兼容所有三种入参组合,最低可兼容至C11标准,完全满足C17及更早版本的使用要求。
实现思路
通过自定义类型萃取自动识别参数的底层公共类型T,无需拆分多个重载:
- 首先定义类型萃取工具,统一提取原生类型
T和包装类型C<T>的底层T - 编写单个通用
compute模板,自动推导两个入参的元素类型,通过萃取校验类型合法性 - 直接复用原有
C类的operator+重载即可完成计算逻辑
完整实现代码
#include <type_traits> template <typename T> class C { public: T x, y; C() = default; C(T x, T y) : x(x), y(y) {} operator T() const { return x; } C operator +(const C<T> &c) const { return C(x + c.x, y + c.y); } C operator +(const T &t) const { return C(x + t, y); } }; // 类型萃取:提取底层T类型 template<typename T> struct extract_type { using type = T; }; template<typename T> struct extract_type<C<T>> { using type = T; }; template<typename T> using extract_type_t = typename extract_type<std::remove_cv_t<T>>::type; // 单个通用compute模板 template<typename A, typename B> std::enable_if_t< std::is_same_v<extract_type_t<A>, extract_type_t<B>> && (std::is_same_v<A, extract_type_t<A>> || std::is_same_v<A, C<extract_type_t<A>>>> && (std::is_same_v<B, extract_type_t<B>> || std::is_same_v<B, C<extract_type_t<B>>>> , void> compute(A* a, B* b, size_t size) { while (size--) a[size] = a[size] + b[size]; } int main() { const size_t size = 4; C<float> a[size]; float b[size]; compute(a, b, size); compute(b, a, size); compute(a, a, size); }
兼容性说明
如果需要兼容C++11标准,仅需把代码中所有_v后缀的类型 trait 换成::value写法即可,其余逻辑完全不变:
- 把
std::is_same_v<X, Y>替换为std::is_same<X, Y>::value - 把
std::enable_if_t<cond, T>替换为typename std::enable_if<cond, T>::type
内容的提问来源于stack exchange,提问作者no one special
相关产品推荐
相关产品推荐

