如何实例化一个没有强制类型转换的类模板



我想运行第一个实例化而不是第二个实例化,但是编译器将参数作为整数并返回错误。

注意,使用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>的一个实例。你调用的强制转换实际上是调用转换构造函数并创建一个新对象;你只是让它看起来像是在进行转换。

相关内容

最新更新