【问题标题】:Tuple and summaring元组和总结
【发布时间】:2020-01-26 21:22:04
【问题描述】:

如何编写一个函数来检查你是否可以总结所有元组元素

template <size_t ID, class T>
int check(const T& p)
{
    size_t n = std::tuple_size_v<T>;
    auto sum = std::get<0>(p);
    if constexpr (ID < std::tuple_size_v<T>) {
        if (sum += std::get<ID>(p)) {
            check<ID + 1>(p);
        }
        else
...

【问题讨论】:

  • 您希望所有类型都是算术类型吗?相同的算术类型?您想像折叠表达式一样简单地在所有相邻对上调用 + 吗?
  • 扩展@alterigel 的问题,您想考虑促销吗?你想强制总和与第一个元素的类型相同吗?这就是你的代码 sn-p 所暗示的?
  • 您想要一个字符串元组通过您的检查吗?字符串支持operator+,但该操作很少称为“求和”。检查的重点应该是什么:使用符号+ 还是使用产生通常称为“sum”的运算? (我想我一直在尝试定义“可以总结”。)

标签: c++ tuples metaprogramming


【解决方案1】:

您可以使用部分特化和折叠表达式来检查std::tuple&lt;T1, T2, T3&gt;是否可以调用T1{} + T2{} + T3{}

#include <tuple>
#include <iostream>
#include <string>

template <typename Tuple, typename = void>
struct check_impl : public std::false_type {};

template <typename... Ts>
struct check_impl<std::tuple<Ts...>, std::void_t<decltype((std::declval<Ts>() + ...))>> : public std::true_type {};

template <typename Tuple>
constexpr bool check = check_impl<Tuple>::value;

int main() {
    std::cout << check<std::tuple<int, double, char>> << " " << check<std::tuple<int, std::string>>;
}

【讨论】:

    【解决方案2】:

    实现相同且更有效结果的一些替代方法:

    #include <tuple>
    #include <iostream>
    #include <string>
    
    template <typename... Ts>
    constexpr auto check_impl(...) noexcept -> bool { return false; }
    
    template <typename... Ts>
    constexpr auto check_impl(int) noexcept -> decltype((std::declval<Ts>() + ...), bool{}) {
        return true;
    }
    
    template <typename... Ts>
    constexpr bool check(std::tuple<Ts...>) noexcept {
        return check_impl<Ts...>(0);
    }
    
    int main() {
        std::cout << check(std::tuple<int, double, char>{}) << ' ' << check(std::tuple<int, std::string>{});
    }
    

    【讨论】:

      猜你喜欢
      • 2019-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多