gpt4 book ai didi

c++模板,如何将模板参数映射到其他模板参数

转载 作者:行者123 更新时间:2023-12-01 14:35:04 29 4
gpt4 key购买 nike

我能以某种方式制作模板参数映射吗?假设我有以下功能:

template<typename T>
T SumCoefficients(const std::vector<T>& coeffs) {
T sum = static_cast<T>(0);
for(int i=0; i<100; ++i) {
sum += SomeFunc<T>(i) * coeffs[i];
}
return sum;
}

// explicit instantiation

template double SumCoefficients(const std::vector<double>& coeffs);
template float SumCoefficients(const std::vector<float>& coeffs);
template Vector3d SumCoefficients(const std::vector<Vector3d >& coeffs);

现在,假设我不想调用 SomeFunc<T>(i)但是相反,如果 T==float,我想使用 SomeFunc<float> ,如果 T==double 我想使用 SomeFunc<double> , 但如果 T==Vector3d 我不想使用 SomeFunc<Vector3d>而是SomeFunc<double>

现在我当然可以明确地实现 template <> Vector3d SumCoefficients(std::vector<Vector3d > coeffs) { ... }然后显式调用 SomeFunc<double> ,但我想知道是否有一种优雅的方法可以只用一个模板实现加上显式实例化就给我相同的结果。

最佳答案

constexpr if 方法很好,但我想添加另一个我认为更可取的解决方案,如果您在代码库中多次调用 SomeFunc

我的解决方案的另一个优点是,如果您有很多类型或者您以后需要能够添加类型,它可以更好地扩展,因为映射逻辑封装在模板特化中而不是调用代码中。

我假设,您在语义上想要的是类似于 T 的标量类型:

template<typename T>
struct scalar_type {

using type = T;
};

template<typename T>
using scalar_t = typename scalar_type<T>::type;

现在您可以为所有类型的 vector 或矩阵或您需要的任何类型添加此模板的特化。

template<>
struct scalar_type<Vector3d> {

using type = double;
};

您的调用代码如下所示:

template<typename T>
auto SumCoefficients(const std::vector<T>& coeffs) {
scalar_t<T> sum;
for(int i=0; i<100; ++i) {
sum += SomeFunc<scalar_t<T>>(i) * coeffs[i];
}
return sum;
}

如果您仅限于使用 c++11,调用站点可能如下所示:

template<typename T, typename Scalar = scalar_t<T>>
Scalar SumCoefficients(const std::vector<T>& coeffs) {
Scalar sum;
for(int i=0; i<100; ++i) {
sum += SomeFunc<Scalar>(i) * coeffs[i];
}
return sum;
}

查看完整示例 here

关于c++模板,如何将模板参数映射到其他模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63243279/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com