lundi 24 octobre 2016

Templatize enum class operators

I'm trying to create a flags bitfield using C++11 enum classes. I'm looking for a way to templatize the operators' return types so they can be used as in code below:

#include <iostream>

enum class Flags {
        one = 1,
        two = 1 << 1,
        three = 1 << 2,
        four = 1 << 3
};

#define _CONVERT(_operator) \
static_cast<T>(static_cast<int>(lhs) _operator static_cast<int>(rhs))

template <typename T>
T operator & (const Flags& lhs, const Flags& rhs) {
        return _CONVERT(&);
}

template <typename T>
T operator | (const Flags& lhs, const Flags& rhs) {
        return _CONVERT(|);
}

#undef _convert


int main()
{
        Flags flag = Flags::one | Flags::two | Flags::three;

        if (flag & Flags::two)
                std::cout << "Flag has two" << std::endl;

        if (flag & Flags::four)
                std::cout << "Flag has four" << std::endl;

        std::cout << static_cast<int>(flag) << std::endl;
}

However, there are several problems:

  • Flags flag = Flags::one | Flags::two | Flags::three; can't deduce type to be Flags
  • if (flag & Flags::four) can't deduce type to be bool

I'm new to templates and am kinda lost when it comes to template deduction mechanisms. Also, i tried to create create conversion operator

operator bool(const Flags& flag)

but with no result.

Aucun commentaire:

Enregistrer un commentaire