【问题标题】:How can we ensure using concepts that both return type as well as argument types of variadic template is same?我们如何确保使用可变参数模板的返回类型和参数类型相同的概念?
【发布时间】:2023-03-08 01:48:01
【问题描述】:

在下面的代码 sn-p 中,我使用了可变参数模板 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;
}

【问题讨论】:

    标签: c++ templates c++20 c++-concepts variadic


    【解决方案1】:

    您可以使用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 {
    
    }
    

    【讨论】:

    • #1 看起来很优雅。
    【解决方案2】:

    你总是可以使用你的返回表达式的类型

    decltype((... + args))
    

    并根据需要限制它

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-08
      • 2022-10-21
      • 1970-01-01
      • 2022-01-09
      • 1970-01-01
      • 1970-01-01
      • 2019-11-23
      • 1970-01-01
      相关资源
      最近更新 更多