微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我们如何确保使用可变参数模板的返回类型和参数类型相同的概念?

如何解决我们如何确保使用可变参数模板的返回类型和参数类型相同的概念?

在下面的代码片段中,我使用了可变参数模板 findSum 函数,并使用概念确保该函数的参数类型相同,但有人可以建议我如何确保该函数的返回类型也与该函数匹配参数类型。

#include <iostream>
#include <concepts>
template<typename F,typename... R>
struct FirstvariadicType
{
    using Type = F;
};

template<typename... Ts>
requires requires(Ts... args){
std::conjunction_v<std::is_same<typename FirstvariadicType<Ts...>::Type,Ts>...>;
}
auto findSum(Ts... args)
{
     return (... + args);
}
int main()
{
    std::cout<<"sum of 2 and 3 is "<<findSum(2,3)<<std::endl;
    return 0;
}

解决方法

您可以使用 std::same_as 来实现,它的概念等同于 std::is_same。只需在参数和返回类型中使用这个概念:

template<typename T>
auto f(T a,std::same_as<T> auto... b) -> std::same_as<T> auto {

}

或者一直使用简洁的语法:

auto f(auto a,std::same_as<decltype(a)> auto... b) -> std::same_as<decltype(a)> auto {

}

或者没有:

template<typename T,std::same_as<T>... Rest>
auto f(T a,Rest... b) -> std::same_as<T> auto {

}
,

您始终可以采用返回表达式的类型

decltype((... + args))

并根据需要对其进行约束

std::is_same<decltype((... + args)),typename FirstVariadicType<Ts...>::Type>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。