我有两个以下类型的变体对象
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上的代码。