gpt4 book ai didi

c++ - 如何使用访问者对一系列变体求和?

转载 作者:搜寻专家 更新时间:2023-10-31 01:27:20 26 4
gpt4 key购买 nike

我正在尝试找到一种方法来使用访问者对 std::variantstd::array 求和。我已经走到这一步了,但我一辈子都想不出如何在不在访问者 lambda 列表头部包含一个 void 条目的情况下推断出访问者的类型。

有谁知道我可以推断出访问者中 lambda 的返回类型的方法,这样我就不必依赖它了吗?

这是我现在得到的:

#include <array>
#include <iostream>
#include <string_view>
#include <type_traits>
#include <variant>

using namespace std::literals::string_view_literals;

template<typename... Base>
struct Visitor: Base ... {
using Base::operator()...;
};

template<typename... T>
Visitor(T...) -> Visitor<T...>;

// There has to be a better way to deduce Result than what I'm doing...
template<typename... T, typename S, typename... Ss, size_t N, typename Result = typename std::result_of_t<S()>>
constexpr std::enable_if_t<std::is_arithmetic_v<Result>, Result>
summation(const Visitor<S, Ss...> &visitor, const std::array<std::variant<T...>, N> &array) {
Result sum{};
for (const auto &a: array)
sum += std::visit(visitor, a);
return sum;
}

int main() {
constexpr Visitor visitor {
// This first entry should be unnecessary, I would think:
[]() -> double { return 0; },
[](double d) -> double { return d + 3.4; },
[](int i) -> double { return i - 2; },
[](std::string_view s) -> double { return s.size(); }
};

constexpr std::array<std::variant<int, double, std::string_view>, 5> arr{9.0, 9, 3, 5.2, "hello world"sv};
constexpr auto val = summation(visitor, arr);
std::cout << val << '\n';
}

编辑:我希望结果是 constexpr

感谢您的帮助。

最佳答案

auto 在那里让编译器为您处理时,您的类型推断过于明确。

一旦您处于函数 decltype()std::declval() 的范围内,就可以进行推断(需要创建默认初始化目标)这很容易,因为您可以简单地模拟访问者的实际调用。

template<typename... T, typename S, typename... Ss, size_t N>
constexpr auto summation(const Visitor<S, Ss...> &visitor, const std::array<std::variant<T...>, N> &array) {

using Result = decltype(std::visit(visitor, std::declval<std::variant<T...>>()));
static_assert(std::is_arithmetic_v<Result>);

Result sum{};
for (const auto &a: array)
sum += std::visit(visitor, a);
return sum;
}

我实际上更喜欢这种风格,因为错误的调用实际上会产生一个合理的错误消息,而不是“找不到函数”。也就是说,除非您将拥有非算术版本的 accumulate(),您正试图对其进行 sfinae(这会很奇怪)。

关于c++ - 如何使用访问者对一系列变体求和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53532609/

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