- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想要一个通过二元运算符获取(未计算的)Phoenix 表达式的类类别。基本上这个想法是类处理表达式,例如,将表达式打印到屏幕。
问题是 Phoenix 重载了所有二元运算符,除非存在精确匹配,否则 Phoenix(惰性)运算符是首选。 是否有可能让 Phoenix 在劫持运营商方面不那么贪心?
示例代码:
#include<boost/phoenix.hpp>
#include<iostream>
namespace mylib{
template<class T>
struct myclass{};
template<class P, class T>
auto operator<<(
myclass<P>& p,
boost::phoenix::actor<
boost::proto::exprns_::basic_expr<
boost::proto::tagns_::tag::terminal,
boost::proto::argsns_::term<T>,
0l
>
> const& t
)->decltype(p){return p << "expression[" << t() << "]";}
}
int main(){
mylib::myclass<int> A;
A << boost::phoenix::val(3.); // Doesn't work as expected. Generates a Phoenix `shift``<<` expression. Not the desired outcome.
mylib::operator<<(A, boost::phoenix::val(3.)); // works as expected
}
一个解决方案是不要重载二元运算符,但问题更多的是如何让 Phoenix 不那么贪婪。
编辑:惯用的解决方法,hold
函数:
在几次不成功的尝试之后,我改变了我的看法,这似乎是一个坏主意,因为必须与 Phoenix/Proto 系统进行激烈的斗争,其中每个 C++ 表达式都解释为构建一个 Phoenix 表达式。所以,我决定定义一个暂时离开凤凰世界的函数,带hold函数。
namespace boostx{ // warning: the attempt to deal with rvalues in this code could be wrong, feedback is welcomed
namespace phoenixx{
template<class T> struct held{
T release_;
decltype(auto) release(){return release_;}
decltype(auto) release() const{return release_;}
friend decltype(auto) release(held& ht){return ht.release();}
friend decltype(auto) release(held const& ht){return ht.release();}
};
template<class T, typename = std::enable_if_t<boost::phoenix::is_actor<std::decay_t<T>>::value> >
held<T> hold(T&& t){
return {std::forward<T>(t)};
}
}}
(也许Phoenix中已经存在(或应该存在)这样的功能,它是对actor
类的补充。)
然后库有一个特殊的重载来处理这个持有的
对象,它在正确的上下文中release
d。
namespace mylib{
... same as before, plus this new overload ...
template<class P, class Actor>
auto operator<<(
myclass<P>& p,
boostx::phoenixx::held<Actor> const& ha
)->decltype(p){
return mylib::operator<<(p, ha.release());
}
}
最后,这有效:
int main(){
mylib::myclass<int> A;
A << hold(boost::phoenix::val(3.));
mylib::operator<<(A, boost::phoenix::val(3.)); // works as expected
}
据我所知,其他函数式语言最终需要这种函数来暂停急切的表达式简化或构造。例如:https://reference.wolfram.com/language/ref/Hold.html
欢迎提供反馈。
最佳答案
总的来说,我认为使用 Proto Transform 可以更好地完成您想要实现的目标。
具体来说,您要对抗的是 ADL。并且没有办法让 Proto 对此“不那么贪婪”,因为它是一种语言机制[1]。
但是,ADL 也应该拉入 mylib::operator<<
.给了什么?
您的重载需要 Actor const&
.但是请注意,如果它可以被非 const 引用获取,则该重载将是首选。您可以按值(value)和利润来获取它:
#include<boost/phoenix.hpp>
#include<iostream>
namespace mylib{
template<class T>
struct myclass{};
template<class P, class T>
auto operator<<(
myclass<P>& p,
boost::phoenix::actor<
boost::proto::exprns_::basic_expr<
boost::proto::tagns_::tag::terminal,
boost::proto::argsns_::term<T>,
0l
>
> t
)->decltype(p){
std::cout << __PRETTY_FUNCTION__ << " arg: " << t() << "\n";
return p; // << "expression[" << t() << "]";
}
}
int main(){
mylib::myclass<int> A;
A << boost::phoenix::val(3.);
}
具有通用引用的版本可能更清晰:
template<class P, class Actor>
auto operator<<(myclass<P>& p, Actor&& t) -> decltype(p) {
std::cout << __PRETTY_FUNCTION__ << " arg: " << t() << "\n";
return p;
}
您可以使用标签调度或 SFINAE 进一步选择特定类型的 Actor
关于c++ - 是否有可能让 Phoenix 对二元运算符的贪婪程度降低一个档次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30314372/
我在堆栈上创建了这段代码: function increase_brightness(hex, percent){ var r = parseInt(hex.substr(1, 2), 16)
为什么我能够LOWER COALESCE 中的每个项目,但无法LOWER整个COALESCE,否则我会遇到语法错误?例如: SELECT COALESCE(LOWER(google_provider_
我在谷歌上搜索到的所有内容都表明,以下任何一项都会将 double 舍入到小数点后两位。 double roundToFourDecimals(double d) { DecimalForma
我正在开发一个 flexdashboard/storyboard,我想在其中降低每个帧的高度。那可能吗? 示例代码: --- title: "Flex" output: flexdashboard
我在 WPF 中有一个图像控件。我需要减小图像尺寸控件的宽度和高度。但是当我这样做时,图像看起来不太好。数据丢失更多。 所以我想降低图像分辨率而不是仅仅改变图像控件的宽度和高度。 任何人都可以帮助我如
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题?通过 editing this post 添加详细信息并澄清问题. 1年前关闭。 Improve this
我正在扩展 Fluent NHibernate,以便更好地与 F# 一起使用(即引用支持),并希望获得一些关于降低 API 流畅性的反馈。 F# 要求使用返回值,除非它们是单位类型。所以这最终以“|>
我们有一个 BizTalk 2010 接收位置,它将获取一个 70MB 的文件,然后使用入站映射(在接收位置)和出站映射(在发送端口)生成一个 1GB 文件。 执行上述过程时,SQL Server 会
我的代码分析插件提示包含以下代码的方法中的代码复杂性。我注意到以下代码看起来可以组合,但我不知道如何做到这一点: for(Command command : commands) { if (c
我正在寻找一种方法来始终忽略 R 中 float 之间的微小差异(根据 IEC 60559,这些是 double 浮点),通过使用基本 R 工具而不诉诸 C 或 C++。换句话说,我想“四舍五入” d
在 Blazor 中使用 ChartJs.Blazor 的 BarChart 组件时是否可以降低甚至关闭动画速度?我发现这个 NuGet 包非常有用,但我不知道如何在更新条形图时关闭动画。为了更容易忽
所以我为一个游戏编写了这段代码,现在该游戏的速度非常快。我想降低 FPS,让游戏慢一点。 我认为我唯一的出路就是制作一个计时器。但我发现很难找到放置计时器的位置?谁能帮我解决这个问题吗? 所以我为一个
我正在编写一个程序,我担心它运行所需的时间和所占用的空间。 在程序中我使用了一个变量来存储数组的长度: int len=newarray3.length; 现在,我想知道是否能够通过不使用 len 变
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 2 年前。 Improve th
我用Java编写了一个程序,但它的计算时间很长,我不知道为什么。有人可以指点一下以降低复杂性吗?此外,在计算一些值(例如 3,100 之后)后,它会给出空指针异常。代码: public class F
我有下图,由 1 行 2 列的网格组成。我愿意 降低右侧子图的高度(3D PREDICTION),使棋盘平面看起来有点挤压并显示更好的视角。 在左侧子图的顶部添加一些边距(2D PREDICTION)
是否有一种简单的方法可以更改以 RGB 字符串形式给出的颜色的亮度? 例如 in_RGB = '#FF0000' --> out_RGB = '#CC0000' 最佳答案 将十六进制字符串转换为 R
我已经编写了代码来更改对象(不是进程)(在本例中是文件)的完整性级别。据我们所知,我们从中等完整性级别开始,但我想将其降低到“低”。我想运行完整性较低的 .txt 文件而不是默认介质。 我使用 WIN
是否可以在保持原始宽高不变的情况下降低图像分辨率? 我已经使用 BitmapFactoryOptions 尝试了几个选项: 在样本大小 inDensity、inScaled、inTargetDensi
是否有高级(Java)或低级方式(使用 native 代码)将 Android 设备上的蓝牙信号强度更改为最低? 目标是使设备在 20 厘米范围内可被发现?在 Internet 上根本找不到与此相关的
我是一名优秀的程序员,十分优秀!