我正在开发一个遗留库,它需要向后兼容 C++03,但也向前兼容以利用移动语义和显式转换等 C++11 功能。
那么,是否可以在 C++03 中模拟显式转换?我显然知道显式 bool(或“安全”bool)习语——但这仅适用于转换为 bool 类型。是否可以在 C++03 中模拟通用的显式转换运算符?
我查了一下,在一本名为“Imperfect C++ : Practical Solutions for Real-Life Programming”的书中找到了关于这个的讨论。
在这本书中,他们讨论了一些关于在 C++03 中模拟显式转换的想法(这本书是在 C++11 之前写的)。最终,他们建议创建一个 explicit_cast<T>模板。但是,我不喜欢该解决方案,因为我希望用户能够简单地使用 static_cast<T> ,在 C++11 中运行良好。
因此,另一种解决方案是强制编译器进行两次 转换,这将不允许隐式转换。一个例子是这样的:
class int_cast
{
public:
int_cast(const int& v) : m_value(v)
{ }
operator int() const
{
return m_value;
}
private:
int m_value;
};
struct Foo
{
Foo()
{
x = 10;
}
operator int_cast() const
{
return int_cast(x);
}
int x;
};
在这里,一个 Foo应该显式转换为int ,但不是隐含的。 (此代码几乎是从 Imperfect C++ 中逐字提取的,除了在他们的示例中,他们将自定义 Time 对象转换为 std::tm 。
但是,这实际上不起作用,至少不使用 GCC 4.7.2:
Foo f;
int x = static_cast<int>(f);
这导致:
test3.cpp: In function ‘int main()’:
test3.cpp:44:28: error: invalid static_cast from type ‘Foo’ to type ‘int’
所以我猜“不完美的 C++”在这里是错误的。编译器无法转换 Foo到int ,即使有明确的强制转换。 (也许这适用于较旧的编译器?)那么,是否可以在 C++03 中模拟它(不使用自定义转换运算符)?
最佳答案
“不完美的 C++”是正确的,因为它使用了一个自定义的“关键字”——实际上是一个伪装成关键字的函数名(与例如:Tribool 的 indeterminate 不同) .如果您尝试 static_cast,您会因该语言只能接受涉及最多一种用户定义类型的转换链的限制而崩溃,而您有两个转换 - 从“Foo”到“int_cast”和从那里到 int。
如果你特别希望能够 static_cast 那么你可能不得不用宏来破解一些东西来取代正常的 static_cast... 并接受生活在 Undefined行为之地。我的首选实际上是work in the inverse direction :在 C++11 模式下,只需使用 explicit_cast 并使用宏将其重新定义为 static_cast 调用。我在我的 C++ 向后移植工具包中使用了显式转换,因此在我编写的所有 C++ 代码中都使用了显式转换,到目前为止我没有发现任何重要问题。
关于c++ - 在 C++03 中模拟显式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22130383/
我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]
这道题是thisquestion的逆题.给定一个散列,每个键都有一个数组,例如{[:a,:b,:c]=>1,[:a,:b,:d]=>2,[:a,:e]=>3,[:f]=>4,}将其转换为嵌套哈希的最佳方法是什么{:a=>{:b=>{:c=>1,:d=>2},:e=>3,},:f=>4,} 最佳答案 这是一个迭代的解决方案,递归的解决方案留给读者作为练习:defconvert(h={})ret={}h.eachdo|k,v|node=retk[0..-2].each{|x|node[x]||={};node=node[x]}node[
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou
我正在使用Rails构建一个简单的聊天应用程序。当用户输入url时,我希望将其输出为html链接(即“url”)。我想知道在Ruby中是否有任何库或众所周知的方法可以做到这一点。如果没有,我有一些不错的正则表达式示例代码可以使用... 最佳答案 查看auto_linkRails提供的辅助方法。这会将所有URL和电子邮件地址变成可点击的链接(htmlanchor标记)。这是文档中的代码示例。auto_link("Gotohttp://www.rubyonrails.organdsayhellotodavid@loudthinking.
我收到格式为的回复#我需要将其转换为哈希值(针对活跃商家)。目前我正在遍历变量并执行此操作:response.instance_variables.eachdo|r|my_hash.merge!(r.to_s.delete("@").intern=>response.instance_eval(r.to_s.delete("@")))end这有效,它将生成{:first="charlie",:last=>"kelly"},但它似乎有点hacky和不稳定。有更好的方法吗?编辑:我刚刚意识到我可以使用instance_variable_get作为该等式的第二部分,但这仍然是主要问题。
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p