You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++17及更早版本如何实现支持混合入参的单个compute模板函数

问题解答

可以实现,仅需单个模板即可兼容所有三种入参组合,最低可兼容至C11标准,完全满足C17及更早版本的使用要求。

实现思路

通过自定义类型萃取自动识别参数的底层公共类型T,无需拆分多个重载:

  1. 首先定义类型萃取工具,统一提取原生类型T和包装类型C<T>的底层T
  2. 编写单个通用compute模板,自动推导两个入参的元素类型,通过萃取校验类型合法性
  3. 直接复用原有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 13:36:04