gpt4 book ai didi

c++ - 有什么方法可以跳过std::visit中一些变体类型的重载组合?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:18:01 24 4
gpt4 key购买 nike

std::visit 支持多种输入变体。但是,代码应该处理来自这些变体的类型的所有组合。

有没有办法跳过不“有意义”的组合?

例如:

template<class... Ts> 
struct overloaded : Ts... { using Ts::operator()...; };

template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>;

int main() {
std::variant<int, float, char> v1 { 's' };
std::variant<int, float, char> v2 { 10 };

std::visit(overloaded{
[](int a, int b) { },
[](int a, float b) { },
[](int a, char b) { },
[](float a, int b) { },
[](float a, float b) { },
[](float a, char b) { },
[](char a, int b) { },
[](char a, float b) { },
[](char a, char b) { }
}, v1, v2);

return 0;
}

是否有机会只实现几个重要的组合,而“留下”其余部分?(当然,如果您忘记实现一种组合,编译器现在会报告严重错误...)

也许是通用的 lambda?

std::visit(overloaded{
[](int a, int b) { },
[](int a, float b) { },
[](int a, char b) { },
[](float a, int b) { },
[](auto a, auto b) { }, // <<
}, v1, v2);

可行,但我想知道是否有更好的解决方案?

更新:这是带有答案中提到的解决方案的 Playground : http://coliru.stacked-crooked.com/a/78d9f2f25789bad2

最佳答案

是的,通用 lambda 是一个非常好的解决方案。您提出的解决方案确实适用于广告垃圾。

通常的重载规则适用。

[](auto a, auto b)

在这个意义上等同于

template <class T1, class T2> auto foo(T1 a, T2 b) const;

任何与非模板化重载之一不完全匹配的内容都将调用通用 lambda。

您可以通过提供类似 [] (int a, auto b) 的内容来混淆一些事情和 [] (auto a, auto b) .仍然适用通常的重载规则。

或者使用 []<class T>(T a, T b) 进行更多混合(C++20 起)

关于c++ - 有什么方法可以跳过std::visit中一些变体类型的重载组合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52074993/

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