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);
}
当我在 main() 中写入时:
Employee e1(EmployeeType::Manager);
或
Employee e2(Employee(EmployeeType::Manager));
效果很好。 当我这样写时:
Employee e3({});
Employee e4(EmployeeType{});
Employee e5(EmployeeType(123));
编译器编译它。但我想使用 c++ 关键字或使用其他东西来禁止它。我不知道怎么办。 我只想允许这样做:
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));
我该怎么做?
我在 Ubuntu 16.04 LTS 中使用 g++ 5.4.0。
我在 Qt Creator 4.1.0 中编写代码,并在配置文件中启用了 C++11:
CONFIG += c++11
最佳答案
您可以通过声明 initializer_list
构造函数来阻止 Employee e3({});
。当初始化器是花括号列表时,这始终是首选:
Employee(std::initializer_list<int>) = delete;
模板类型并不重要。
但是,不可能阻止调用者将某些值转换为 EmployeeType
,然后将其作为构造函数参数提供。
关于c++11 - 将枚举类作为构造函数的参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45270810/