分别提供两个变体对象与在数组中提供的区别

问题描述 投票:0回答:0

我有两个以下类型的变体对象

struct FigureMove {};
struct PieceMove {};
using Move = std::variant<FigureMove, PieceMove>;

我想为一个函数提供两个 Move 对象,并根据变体中的底层类型调用不同的函数。 我有两个不同版本的函数,它们接受 Move 对象。一种将它们作为单独的函数参数,另一种将它们都放在一个 array 中。 注意,我打算一直供应一个FigureMove和一个PieceMove,只是他们的顺序事先不清楚。

bool areMovesValid(const FigureMove &figureMove0, const PieceMove &pieceMove1)
{
    return {};
}

bool areMovesValid(const PieceMove &pieceMove0, const FigureMove &figureMove1)
{
    return {};
}

//#define USE_ARRAY

#ifdef USE_ARRAY
bool areMovesValid(const std::array<Move, 2> &moves)
{
    const auto &variantMove0 = moves[0];
    const auto &variantMove1 = moves[1];

#else
bool areMovesValid(const Move &variantMove0, const Move &variantMove1)
{
#endif
    return std::visit(
        [variantMove1](const auto move0)
        {
            return std::visit(
                [move0](const auto move1)
                {
                    return areMovesValid(move0, move1);
                },
                variantMove1);
        },
        variantMove0);
}

带有 array 的版本会抛出大量的编译时错误。使用 gcc 或 clang.

为什么会这样,我该如何解决?

这是godbolt上的代码。

c++ variant
© www.soinside.com 2019 - 2024. All rights reserved.