我想写一个包含X和Y值的2d(数学)矢量类。我希望它为运算符(如+)提供重载,因此我可以轻松地使用它来表达我的代码中的数学公式。考虑一下:
template <class T>
struct Vector
{
T x, y;
inline Vector<T> operator +(const Vector& other) const
{
return {x + other.x, y + other.y};
}
};
正如您所看到的,我利用C ++ 11在返回语句中使用初始化列表的能力。但是,它们仍然不是表达式 - 我无法对它们进行操作。这就是我的问题。我希望课程是POD。我无法定义自定义构造函数,以便我可以通过参数初始化x和y。这很好,因为我可以使用初始化列表进行构造,例如:
Vector<int> foo = {1, 2};
但是,当我需要在表达式中构造另一个Vector时,我不能使用它(运算符*没有定义,但这里没关系):
Vector<int> result = (foo + {1, 2}) * 12;
正如我之前所说,构造函数替代方案不是一种选择。我很想听到有关此问题的任何意见,因为除了将{1,2}存储在命名变量中之外,我无法想到这个问题的任何解决方案。
答案 0 :(得分:3)
最简单的选择是使用聚合初始化创建临时:
Vector<int> result = (foo + Vector<int>{1, 2}) * 12;
或者,您可以使用C ++ 11的用户定义文字做一些魔术,以便像"1,2"_v
之类的东西成为您的对象之一:
Vector<int> operator "" _v(const char* literal, size_t)
{
std::stringstream literal_stream(literal);
Vector<int> vec;
literal_stream >> vec.x;
literal_stream.ignore();
literal_stream >> vec.y;
return vec;
}
你绝对可以在这里进行一些格式检查。然后你可以这样做:
Vector<int> result = (foo + "1,2"_v) * 12;