c++11 - 将枚举类作为构造函数的参数传递

标签 c++11 enums

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/

相关文章:

python - 如何实现一个工厂类?

java - 给定提供给其构造函数的参数,如何找到枚举值?

c# - 我应该使用什么模式来表达分层枚举?

c++ - 压入和弹出 std::tuple 的第一个元素

c++ - 为什么 std::atomic 的 compare_exchange 会引用期望值?

c++ - basic_ostringstream::str 悬挂指针

C++11 numeric_limits<float> 和算术

mysql - 在数据库升级后在 MySQL 中选择一个枚举不起作用,为什么?

java - 如何在Spring的xml中使用 'EnumOrdinalTypeHandler'和mybatis的typeHandler?

c++ - 在调用 pthread_cond_destroy 之前,如何发出信号以中止/唤醒所有等待条件变量的线程?