我有一个班级A
我已经重载了operator[]
,以便如果班级a
的对象A
可以传递给std::valarray它以下列方式:
std::valarray<int> in{2,1};
auto b = a[in]; // lets say this returns an int k = 2
auto c = a[{2,1}]; // also returns an int k = 2
但是,在使用GTEST框架时,它不喜欢a[{2,1}]
符号,并且如果我们要尝试macro "EXPECT_EQ" passed 3 arguments, but takes just 2
EXPECT_EQ(2, a[{2,1}]);
肯定a[{2,1}]
是一个参数,因为它评估为int
?似乎并非如此。典型的EXPECT_EQ
例如EXPECT_EQ(2, 2);
就可以了。
下面,我有一个类的MWE,它重载[]
以获取std::valarray
类型的参数。
class A
{
private:
std::vector<int> elems;
public:
A(std::vector<int> elems)
: elems(elems){};
int operator[](std::valarray<int> idx) const
{
return get_elem(idx[0]);
}; // getter
int get_elem(int idx) const {return this->elems[idx];}; //getter
int &get_elem(int idx) {return this->elems[idx];}; //setter
};
int main()
{
std::vector<int> elems = {2, 5, 0, 9,
5, 1, 4, 6};
A a(elems);
std::cout<< "hello world" << std::endl;
std::valarray<int> in{2,1};
auto b = a[in]; // lets say this returns an int k = 2
auto c = a[{2,1}]; // also returns an int k = 2
std::cout<< b << std::endl;
std::cout<< c << std::endl;
return 0;
}
鉴于我的main()
显示正确的行为,我怀疑GTEST
存在问题,或者C ++中的评估顺序与我的预期不同?
答案 0 :(得分:2)
由于涉及宏,并且没有摆脱它们,最快的解决方案是明智地使用括号:
EXPECT_EQ(2, ( a[{2,1}] ));
额外的对将阻止逗号被解释为宏的参数分隔符。至于比较本身,带括号的表达式与带括号的表达式具有完全相同的值和值类别。所以一切都应该仍然有效 1 。
<子>
1 - 除非Google Test将decltype
应用于第二个令牌序列,否则额外的括号可能会引起意外。但它不应该这样做。
子>