c++11 - Can't Pass Enum Value to Recursive Template (C++) -
suppose want write recursive template function compares individual value every single element in n-dimensional vector, returning true if there @ least 1 match , false if there none.
i wrote code this, although it's far optimal:
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 = 0; < 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; }
while seems work, i've encountered unusual issue , can't quite understand it. example, following code works:
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 rook on board)
yet following, slight change not:
std::cout << is_equal_any(rook, board); // compile error c2664
apparently function cannot figure out how convert enum value integer. of course, can use static_cast<int>(rook)
, , code compiles , runs expected, that's not ideal. furthermore, know can change board's declaration std::vector<std::vector<piece_name>> board
, (which runs expected) i'd prefer leave @ int
. so possible rewrite these recursive template functions is_equal_any
can take enum values directly? i'm still new c++, appreciate detail in answer possible. thank you.
the problem arises type t
here:
check_for_each(vector, [&is_equal, &value](const t& val) ^
by calling
is_equal_any(rook, board)
t
piece_name
, passing parameter lambda elements of vector of type int
. int
can't implicitly converted enum.
you can't either use directly u
std::vector<int>
or std::vector< std::vector<int> >
or...
if using c++14, use generic lambda auto
:
check_for_each(vector, [&is_equal, &value](const auto& val)
but tagged question c++11, can use trait:
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;
usage:
check_for_each(vector, [&is_equal, &value](const leaf_type_t<u> & val)
btw should avoid nested std::vector
s , linearize single 1 like:
std::vector<int> board {rook, bishop, knight, queen};
then can use std::find.
Comments
Post a Comment