gpt4 book ai didi

c++ - 在表达式内部具有内联构造的 POD 类?

转载 作者:太空狗 更新时间:2023-10-29 21:25:05 26 4
gpt4 key购买 nike

我想编写一个包含 X 和 Y 值的二维(数学) vector 类。我希望它为 + 等运算符提供重载,以便我可以轻松地使用它来表达我的代码中的数学公式。考虑一下:

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 在返回语句中使用初始化列表的能力。但是,它们仍然不是表达式——我无法对它们应用操作。我的问题来了。我希望类(class)成为 POD。我无法定义自定义构造函数以便我可以通过参数初始化 x 和 y。这很好,因为我可以使用初始化列表进行构造,例如:

Vector<int> foo = {1, 2};

但是,当我需要在表达式中构造另一个 Vector 时,我不能使用它(运算符 * 未定义,但在这里无关紧要):

Vector<int> result = (foo + {1, 2}) * 12;

正如我之前所说,构造函数替代方案不是一个选项。我很想听听任何关于这个的意见,因为除了将 {1, 2} 存储在命名变量中之外,我想不出任何解决这个问题的方法。

最佳答案

最简单的选择是使用聚合初始化创建一个临时的:

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;

关于c++ - 在表达式内部具有内联构造的 POD 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14583090/

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