gpt4 book ai didi

c++ - 无法将枚举值传递给递归模板 (C++)

转载 作者:太空狗 更新时间:2023-10-29 23:43:38 24 4
gpt4 key购买 nike

假设我想编写一个递归模板函数,将单个值与 n 维 vector 中的每个元素进行比较,如果至少有一个匹配则返回 true,否则返回 false。

我写了一些代码来做到这一点,尽管它可能远非最佳:

template <typename T, typename Checker>
void check_for_each(const T& v, const Checker condition)
{
condition(v);
}

template <typename T, typename Checker>
void check_for_each(const std::vector<T>& v, const Checker condition)
{
for(unsigned int i = 0; i < v.size(); i++)
{
check_for_each(v[i], condition);
}
}

template <typename T, typename U>
bool is_equal_any(const T& VALUE, const std::vector<typename U> VECTOR)
{
bool is_equal = false;
check_for_each(VECTOR, [&is_equal, &VALUE](const T& val)
{
if(!is_equal && VALUE == val)
{
is_equal = true;
}
});
return is_equal;
}

虽然这似乎可行,但我遇到了一个不寻常的问题,我不太明白。例如,以下代码有效:

enum PIECE_NAME {EMPTY, PAWN, ROOK, KNIGHT, BISHOP, QUEEN, KING};
std::vector<std::vector<int>> board {{ROOK, BISHOP}, {KNIGHT, QUEEN}};
std::cout << is_equal_any(2, board); // outputs 1 (there is a rook on the board)

然而,以下轻微的变化不会:

std::cout << is_equal_any(ROOK, board); // compile error C2664

显然我的函数不知道如何将枚举值转换为整数。当然,我可以直接使用static_cast<int>(ROOK) ,并且代码按预期编译和运行,但这显然并不理想。此外,我知道我可以将董事会声明更改为 std::vector<std::vector<PIECE_NAME>> board , (也按预期运行)但我更愿意将其保留在 int . 那么有没有可能重写这些递归模板函数使得is_equal_any可以直接获取枚举值吗?我对 C++ 还是很陌生,所以我非常感谢您尽可能详细地回答。谢谢。

最佳答案

问题出在类型T这里:

check_for_each(VECTOR, [&is_equal, &VALUE](const T& val)
^

通过调用

is_equal_any(ROOK, board)

TPIECE_NAME ,但是您最终作为参数传递给此 lambda 的是类型为 int 的 vector 的元素。 .但是 int不能隐式转换为枚举。

你不能直接使用 U因为它可能是 std::vector<int>std::vector< std::vector<int> >或者……

如果您使用的是 C++14,则可以使用 generic lambdaauto :

check_for_each(VECTOR, [&is_equal, &VALUE](const auto& val)

但是当你标记你的问题 C++11 时,你可以使用一个特征:

template <typename T>
struct leaf_type {
using type = T;
};

template <typename T>
struct leaf_type<std::vector<T>> {
using type = typename leaf_type<T>::type;
};

template <typename T>
using leaf_type_t = typename leaf_type<T>::type;

用法:

check_for_each(VECTOR, [&is_equal, &VALUE](const leaf_type_t<U> & val)

DEMO

顺便说一句,你应该避免嵌套 std::vector s 并将其线性化为单个,如:

std::vector<int> board {ROOK, BISHOP, KNIGHT, QUEEN};

然后你可以很容易地使用std::find .

关于c++ - 无法将枚举值传递给递归模板 (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45314724/

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