Rolando ServerTown
Rolando ServerTown

Reputation: 141

Pass enum class as a parameter of constructor

enum class EmployeeType {Employee, Manager, Sales, Unknown};

class Employee
{
public:
    Employee() = delete;
    Employee(const Employee&) = delete;
    Employee& operator=(const Employee&) = delete;
    Employee& operator=(Employee&&) = delete;

    Employee(Employee&&) = default;

    explicit Employee(EmployeeType type);
}

When I write in main():

Employee e1(EmployeeType::Manager);

or

Employee e2(Employee(EmployeeType::Manager));

it works fine. When I write like this:

Employee e3({});
Employee e4(EmployeeType{});
Employee e5(EmployeeType(123));

compiler compiles it. But I want to forbid it using c++ keywords or using something else. I don't know how. I want to permit only this:

Employee e6(EmployeeType::Employee);
Employee e7(EmployeeType::Manager);
Employee e8(EmployeeType::Sales);
Employee e9(EmployeeType::Unknown);
Employee e10(Employee(EmployeeType::Employee));
Employee e11(Employee(EmployeeType::Manager));
Employee e12(Employee(EmployeeType::Sales));
Employee e13(Employee(EmployeeType::Unknown));

How can I do it?

I use g++ 5.4.0 in Ubuntu 16.04 LTS.

I write code in Qt Creator 4.1.0 with enabled C++11 in pro-file:

CONFIG += c++11

Upvotes: 2

Views: 402

Answers (1)

M.M
M.M

Reputation: 141554

You can prevent Employee e3({}); by declaring an initializer_list constructor. This is always preferred when the initializer is a braced list:

Employee(std::initializer_list<int>) = delete;

The template type doesn't really matter.

However it is not possible to prevent a caller casting some value to EmployeeType and then providing that as constructor argument.

Upvotes: 4

Related Questions