gpt4 book ai didi

c++ - 如何强制转换优先于其他转换?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:47:28 24 4
gpt4 key购买 nike

我有课:

class IntegerVector:
{
IntegerVector operator * (const int scalar) const;
};

class RealVector:
{
RealVector(const IntegerVector &other);
RealVector operator * (const double scalar) const;
};

我如何强制表达式:integer_vector*1.5 等价于 RealVector(integer_vector)*1.5 而不是 integer_vector*int(1.5) 现在是什么?

编辑

顺便说一句,这些运算符有很多,所以定义 RealVector IntegerVector::operator * (const double scalar) const 不是很令人满意。

最佳答案

在 C++11 中,您可以像这样利用内置类型提升:

#include <type_traits>

class IntegerVector;
class RealVector;

template <class T> struct VectorForType {};
template <> struct VectorForType<int> {typedef IntegerVector type;};
template <> struct VectorForType<double> {typedef RealVector type;};

// This is where we figure out what C++ would do..
template <class X, class Y> struct VectorForTypes
{
typedef typename VectorForType<decltype(X()*Y())>::type type;
};


class IntegerVector
{
public:
template <class T> struct ResultVector
{
typedef typename VectorForTypes<int, T>::type type;
};

template <class T>
typename ResultVector<T>::type operator*(const T scalar) const;
};

class RealVector
{
public:
template <class T> struct ResultVector
{
typedef typename VectorForTypes<double, T>::type type;
};

RealVector();
RealVector(const IntegerVector &other);

template <class T>
typename ResultVector<T>::type operator*(const T scalar) const;
};


int main()
{
IntegerVector v;
auto Result=v*1.5;
static_assert(std::is_same<decltype(Result), RealVector>::value, "Oh no!");
}

如果您不需要 decltype 就需要它,您也可以将类型提升结果实现为元函数。我想一个运算符的实现看起来像这样:

template <class T> inline
typename ResultVector<T>::type IntegerVector::operator*(const T scalar) const
{
typename ResultVector<T>::type Result(this->GetLength());
for (std::size_t i=0; i<this->GetLength(); ++i)
Result[i]=(*this)*scalar;
return Result;
}

关于c++ - 如何强制转换优先于其他转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11482422/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com