我想运行第一个实例化而不是第二个实例化,但是编译器将参数作为整数并返回错误。
注意,使用optional是为了允许对象接收boost::none (python的none的c++版本)。
#include <boost/multiprecision/cpp_int.hpp>
#include <boost/optional.hpp>
using namespace boost::multiprecision;
template<class T>
struct Point
{
explicit Point(T x, T y): x (x), y (y){}
T x;
T y;
};
typedef boost::optional<int128_t> oint128_t;
int main(){
// Point<oint128_t> P(90, 5); // this fails
Point<oint128_t> Q((oint128_t) 91, (oint128_t) 31); // this works
}
始终可以将显式强制转换放在Point
构造函数中。
template<typename S>
explicit Point(S x, S y): x(T(x)), y(T(y)) {}
但是我怀疑从长远来看,这样做会引入更多令人困惑的类型错误。我的建议是像您应该做的那样显式地调用boost::optional
构造函数。T
不是boost::optional<T>
的一个实例。你调用的强制转换实际上是调用转换构造函数并创建一个新对象;你只是让它看起来像是在进行转换。