将 typename type 更改为模板函数 (c++)

Change typename type into the template function (c++)

提问人:lordeji 提问时间:10/26/2022 最后编辑:Masoud Keshavarzlordeji 更新时间:10/26/2022 访问量:120

问:

所以我目前正在努力用模板提升我的技能,但我被一些东西困住了。

如果我的一个对象使用数字,并且我对另一个整数类型的对象进行数学运算,我想返回一个浮点类型的对象。 但是我只能知道它们何时已经在函数中,我想知道是否有办法强制我们的类型名称为某种定义的类型。floating_point

编辑:我看到我的帖子缺乏示例,所以我将向您展示我正在开发的功能。

// Addition : +
template <typename TYP_O1, typename TYP_O2, typename TYP_RE> 
requires (std::integral<TYP_O1> || std::floating_point<TYP_O1>) &&(std::integral<TYP_O2> || std::floating_point<TYP_O2>)

MultiArray<TYP_RE> operator+(MultiArray<TYP_O1>& rMultiArr1, MultiArray<TYP_O2>& rMultiArr2){
    // Création d'un array qui sera la somme des deux MultiArray un à un
    std::vector<TYP_RE> Array;

    for(int i = 0 ; i < (int)rMultiArr1.getArray().size() ; i++) {
        // On les récupère par référence pour faciliter la lecture.
        std::vector<TYP_O1>& Arr1 = rMultiArr1.getArray();
        std::vector<TYP_O2>& Arr2 = rMultiArr2.getArray();

        // On rajoute la somme à la fin du Array
        Array.push_back((TYP_RE)Arr1[i] + Arr2[i]);
     }

    // On crée le MultiArray de la somme des 2
    MultiArray<TYP_RE> result_MultiArr = {rMultiArr1.getDim(), rMultiArr1.getShape(), Array};

    // On renvoie ce MultiArray nouvellement crée
    return result_MultiArr;
}

(我刚刚删除了错误检查)

所以在模板中:是第一个对象的类型,也是第二个对象的类型。TYP_O1TYP_O2

TYP_RE是返回类型,如果其中一个是类型(另一个是“积分”),则这是我想要强制为双精度的类型名MultiArray"floating_point"

C++ 函数 模板 typename

评论

0赞 AndyG 10/26/2022
这是否完全可能取决于函数声明中使用的类型。也许你可以发布一个更完整的例子?简短的回答是,您不能只设置 一些,而是指定返回类型将是 当满足声明中使用的类型的某些属性时。一个稍微长一点的答案是,如果类型在运行时可能是 N 种类型中的 1 种,您将需要一个Typedoubledoublevariant
0赞 HolyBlackCat 10/26/2022
你想要吗?std::conditional_t
0赞 Phil1970 10/26/2022
也许你只需要尾随返回值。但是,鉴于您的问题没有充分的例子,很难知道。在 C++ 中,有很多方法可以做事。我们需要一个协奏曲的例子来告诉你哪一个是最好的。或者,如果你想学习,你可以简单地读一本书。

答:

0赞 Nelfeal 10/26/2022 #1

通常,可以使用 std::conditional 根据条件选择类型。

一个基本的例子:

template<typename LHS, typename RHS>
auto plus(LHS lhs, RHS rhs) -> std::conditional_t<
    std::is_same_v<LHS, double> || std::is_same_v<LHS, double>,
    double,
    int
> {
    return lhs + rhs;
}

如果任一参数是 ,则返回类型为 ,否则为 。请注意,它在这里没有多大意义,因为已经是 if either 或 is(假设它们是基本的算术类型,不包括 or 指针类型)。plusdoubledoubleintlhs + rhsdoublelhsrhslong double

在你的情况下(因为你已经添加了一个代码片段),你可以做这样的事情:

template<typename TYP_O1, typename TYP_O2>
using MultiArraySumResult = std::conditional_t<
    std::is_floating_point_v<TYP_01>,
    MultiArray<TYP_01>,
    MultiArray<TYP_02>
>
// or...
template<typename TYP_O1, typename TYP_O2>
using MultiArraySumResult = MultiArray<std::conditional_t<
    std::is_floating_point_v<TYP_01> || std::is_floating_point_v<TYP_02>,
    double,
    int
>>

然后,您只需将其用作返回类型。您甚至可以不指定返回类型(没有尾随返回类型),将该声明放在函数中,并将其用于返回的局部变量:MultiArraySumResult<TYP_O1, TYP_O2>autousing

template <typename TYP_O1, typename TYP_O2, typename TYP_RE> 
requires (std::integral<TYP_O1> || std::floating_point<TYP_O1>) &&(std::integral<TYP_O2> || std::floating_point<TYP_O2>)
auto operator+(MultiArray<TYP_O1>& rMultiArr1, MultiArray<TYP_O2>& rMultiArr2){
    using ReturnType = std::conditional_t<
        is_floating_point_v<TYP_01>,
        MultiArray<TYP_01>,
        MultiArray<TYP_02>
    >
    ReturnType Array;
    // [...]
    return ReturnType{rMultiArr1.getDim(), rMultiArr1.getShape(), Array};
}

评论

0赞 lordeji 10/26/2022
哦,谢谢!我认为这是我需要的命令。但是,“std::conditional” 和 “std::conditional_t” 和有什么不一样?
0赞 Nelfeal 10/26/2022
@lordeji 查看链接页面。通常,是 的别名。std::trait_t<Ts...>std::trait<Ts...>::type