在表达式内部具有内联构造的 POD 类
POD class with inline construction inside of an expression?
我想写一个保存 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 在 return 语句中使用初始值设定项列表的功能。但是,它们仍然不是表达式 - 我无法对它们应用操作。我的问题来了。我希望类是 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类型吗
- (C++)分析树以计算返回错误值的简单算术表达式
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 提升精神:解析布尔表达式并简化为规范范式
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 使用正则表达式regex_search在字符串中查找字符串
- 如何确认我的constexpr表达式实际上已经在编译时执行
- 概念中的cv限定符需要表达式参数列表
- 为什么constexpr的性能比正常表达式差
- 对于结构,表达式必须是可修改的ivalue
- 当一个值是非常量但用常量表达式初始化时使用constexpr
- 将fold表达式与std::一起用于两个元组
- 断言中的Fold表达式在某些计算机上编译,但在其他计算机上不编译
- 标记 '","' 之前的预期主表达式
- gcc和clang在表达式是否为常量求值的问题上存在分歧
- 如何计算具有指定类型的表达式的相对精度和绝对精度
- 带有用户定义类的c++折叠表达式
- 即使使用调试编译标志,表达式也是"optimized out"
- holeMenuProgram.cpp:38:1 错误:'}'令牌之前的预期主表达式
- 在表达式内部具有内联构造的 POD 类