如何解决C ++计算不应该的表达式
如果此函数返回operator|
,则我忽略了vector
作为给定bool
和函数的过滤器。如果没有,它将在for_each
上调用vector
。
template<typename T,typename Func>
auto operator | (const vector<T> &v,Func f){
bool result = is_same<bool,decltype(f(v[0]))>::value;
vector<T> temp;
if (result){
temp.reserve(v.size());
for(auto itr = v.begin(); itr != v.end(); ++itr){
bool func_return = f(*itr);
if (func_return){
temp.push_back(*itr);
}
}
return temp;
}
else{
for_each(v.begin(),v.end(),f);
return temp;
}
}
当用作过滤器时,此代码可以正常工作,但是for_each
部分已损坏。每当我尝试运行以下代码时:
int main() {
vector<int> v1 = { 2,9,8,7,4 };
v1 | []( int x ) { return x % 2 == 0; } | [] ( int x ) { cout << x << " "; };
}
编译器返回:
error: cannot initialize a variable of type 'bool' with an rvalue of type 'void'
bool func_return = f(*itr);
in instantiation of function template
specialization 'operator|<int,(lambda at
main.cpp:44:43)>' requested here
v1 | []( int x ) { return x % 2 == 0; } | [] ( int x ) { cou...
^
对我来说似乎很奇怪,毕竟编译器不应该在第二个运算符中执行该行,因为result
应该是false
。有人可以帮我吗?
解决方法
此lambda:
super.paintComponent(g)
具有[] ( int x ) { cout << x << " "; }
返回类型,因此此行:
void
不会编译。由于bool func_return = f(*itr);
的值仅取决于result
和Func
,因此您具有必要的信息来决定是否在编译时执行T
分支。您可以使用if
代替运行时的constexpr if
:
if
现在,当用错误的类型实例化该函数时,将不会编译该分支内的代码。
此外,您需要使if constexpr(result)
为编译时间常数,以便在result
条件下使用它。
这里是demo。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。