Reputation: 141
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
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