如何防止构造函数在c ++中转换参数类型?

wis*_*iak 5 c++ constructor casting c++11

我有一个类来存储大的无符号数,我想允许用户创建一个使用对象类型,例如long long,int,unsigned int等等,也从string.我创建了一个构造函数BigNumber(const unsigned long long),BigNumber(const std::string)但我想禁止用户使用如下构造:BigNumber('a')BigNumber(true).我听说过,explicit所以我决定在我的课程定义中写下以下几行:

explicit BigNumber(const bool) = delete; explicit BigNumber(const char) = delete;

不幸的是,当我想创建对象时:BigNumber x(1)或者BigNumber("1234")我得到错误,重载构造函数的调用是不明确的.在我写这些行之前,我没有收到此消息 explicit.如何解决这个问题呢?

Sim*_*ple 6

您可以使用模板来实现:

template<typename T,
         typename = typename std::enable_if<
            std::is_integral<T>::value
            && !std::is_same<char, T>::value
            && !std::is_same<bool, T>::value>::type>
explicit BigNumber(T const n);
Run Code Online (Sandbox Code Playgroud)

不能使用bools或chars 调用此构造函数。