Static_cast 和模板化转换函数
Static_cast and templated conversion function
我有一个 class 包装某种类型并附加一个维度。它应该可以转换为基础类型,但前提是 Dim=0
。转换运算符在其他情况下不应调用(因此函数中的 static_assert
对我不起作用)。
如果 enable_if
结构被删除,但不是这种形式,则以下代码有效。
template<class T, int Dim>
class Unit {
public:
explicit Unit(T const& value): _value(value) {}
template<int D = Dim, typename = typename std::enable_if<D == 0>::type>
operator T() { return _value; }
private:
T _value;
};
auto main() -> int
{
auto a = double{0};
auto u = Unit<double, 0>{a};
auto i = static_cast<int>(u);
return i;
}
这是什么原因,是否有变通方法允许转换,但也限制转换?
据我了解,您想要:
template <class T, int Dim>
class Unit {
public:
explicit Unit(T const& value): _value(value) {}
template <typename U, int D = Dim,
std::enable_if_t<D == 0 && std::is_convertible_v<T, U>, int> = 0>
operator U() { return _value; }
private:
T _value;
};
在 C++20 中,看起来更漂亮
template<class T, int Dim>
class Unit {
public:
explicit Unit(T const& value): _value(value) {}
template <typename U>
requires(Dim == 0 && std::is_convertible_v<T, U>)
operator U() const { return _value; }
private:
T _value;
};
我有一个 class 包装某种类型并附加一个维度。它应该可以转换为基础类型,但前提是 Dim=0
。转换运算符在其他情况下不应调用(因此函数中的 static_assert
对我不起作用)。
如果 enable_if
结构被删除,但不是这种形式,则以下代码有效。
template<class T, int Dim>
class Unit {
public:
explicit Unit(T const& value): _value(value) {}
template<int D = Dim, typename = typename std::enable_if<D == 0>::type>
operator T() { return _value; }
private:
T _value;
};
auto main() -> int
{
auto a = double{0};
auto u = Unit<double, 0>{a};
auto i = static_cast<int>(u);
return i;
}
这是什么原因,是否有变通方法允许转换,但也限制转换?
据我了解,您想要:
template <class T, int Dim>
class Unit {
public:
explicit Unit(T const& value): _value(value) {}
template <typename U, int D = Dim,
std::enable_if_t<D == 0 && std::is_convertible_v<T, U>, int> = 0>
operator U() { return _value; }
private:
T _value;
};
在 C++20 中,看起来更漂亮
template<class T, int Dim>
class Unit {
public:
explicit Unit(T const& value): _value(value) {}
template <typename U>
requires(Dim == 0 && std::is_convertible_v<T, U>)
operator U() const { return _value; }
private:
T _value;
};