- 主题:标准库为什么不喜欢用方法,喜欢独立的函数?
std::any_cast<T1>(T2 x)
放了T2进去,却要拿T1出来, 这个本身就违背了any_cast的语义。
这样的转换,本身就应该另取一个名称。
【 在 mathzqy 的大作中提到: 】
: 模版化可能是一种原因。
: 你可以为任何一个类实现std::any_cast<T1>(T2 x)。这样std::any_cast就可以用在模版函数里,自动对T2适用。
: 但你可能无法为T2添加 T.cast 成员函数。
: ...................
--
FROM 223.72.41.*
我可能没说清楚。
我的意思是 T2 可能是一个别的类似any的类型。考虑下面这个函数。如果你用 t.cast 可能就受限。
template <T1, T2>
T1 sum(std::vector<T2> ts) {
T1 s = T1();
for (auto t in ts) {
s += std::any_cast<T1>(t);
}
return s;
}
【 在 finlab 的大作中提到: 】
: std::any_cast<T1>(T2 x)
: 放了T2进去,却要拿T1出来, 这个本身就违背了any_cast的语义。
: 这样的转换,本身就应该另取一个名称。
: ...................
--
FROM 124.207.9.*
我大概理解,有另一个类型T2, 对他定义一个自己的any_cast,这样他就能与any公用一套代码
这样有时候能带来一些便利,但是感觉不是一个好设计,容易让人混淆
【 在 mathzqy 的大作中提到: 】
: 我可能没说清楚。
: 我的意思是 T2 可能是一个别的类似any的类型。考虑下面这个函数。如果你用 t.cast 可能就受限。
: template <T1, T2>
: ...................
--
FROM 223.72.41.*
别的不说什么了,c++的标准库里,绝大部分都是container类,所谓container,就是指这个东西是个装内容的容器,它不是活的,它存在的意义是让别人去操作,而不是它自发做什么动作,就好像一个水壶是装水的,倒水这个操作,是其他人call一个函数,而不是水壶自己有一个倒水的member function。从这个意义上来说,反而是c#和jave滥用了member function。
关于这点,其实在现代c++中到处可见,比如关于{}初始化,虽然很多人提倡全部用{}来初始化,但是事实上,很多code standard只有在容器类型的填充性质的初始化时才用{},其他类型的初始化或者有其他内部逻辑操作的,都采用()初始化更好。
现代c++,事实上,已经彻底摒弃了虚函数,模板的意义和各种optional, variant, tuple的出现,不光在于避免虚指针,更在于彻底避免在class layout中出现指针,强调编译时和trival plain struct,增加cpu cache hit rate,在一定程度上在代码层面融入硬件层面的信息
--
修改:ziqin FROM 60.191.0.*
FROM 60.191.0.*
举个具体的例子,比如std::size这个函数,考虑你有一堆数1,2,3,4,5,你要求size,然后你又不能hard code size = 5,这个时候,传统来说,你得 std::vector<int>(1,2,3,4,5).size() 或者 std::array(1,2,3,4,5).size(),虽然在c++20中,vector有了constexpr的构造函数,但是基本上有很大可能性,这段代码在老一点的编译器里就变成运行时了,而且代码也不美观,如果是模板代码,还需要加concept限制这个class有.size()这个member function。但是,如果你用 std::size({1,2,3,4,5})呢,这个基本就是一个编译时了。另外比如说std::range,比如你想loop {1.2.3.4.5},现在只需要std::range::for_each({1,2,3,4,5},xxxxx)
--
FROM 60.191.0.*
首先C++卖的是OOP
【 在 z16166 的大作中提到: 】
: 想象一下:
: int.to_string()
: char.to_string()
: ...................
--
FROM 183.192.125.*
C++是oop,但是和java、c#这种有公共祖宗类的oop有点差异
而且也不是卖,你也没出钱买
再者,你可以继承自std::any,自己加一个成员函数
【 在 KnightZorro 的大作中提到: 】
: 首先C++卖的是OOP
--
修改:z16166 FROM 222.130.138.*
FROM 222.130.138.*
我用了10多年正版visual c++, 3年正版clion
花了无数小时学习、使用
【 在 z16166 的大作中提到: 】
: C++是oop,但是和java、c#这种有公共祖宗类的oop有点差异
: 而且也不是卖,你也没出钱买
: 再者,你可以继承自std::any,自己加一个成员函数
: ...................
--
FROM 43.206.234.*
哈哈,你买的是c++工具,不是c++语言本身
当然,工具也很重要
【 在 KnightZorro 的大作中提到: 】
: 我用了10多年正版visual c++, 3年正版clion
: 花了无数小时学习、使用
:
--
修改:z16166 FROM 222.130.138.*
FROM 222.130.138.*
其实我觉得在语法上可以支持一下对既有类的接口扩展
【 在 fanci 的大作中提到: 】
: 标 题: Re: 标准库为什么不喜欢用方法,喜欢独立的函数?
: 发信站: 水木社区 (Wed Apr 24 13:15:36 2024), 站内
:
: C# 支持 extension method,可以实现你的语法
:
: 【 在 finlab (挨踢卢瑟) 的大作中提到: 】
: : 说了一堆, 还是不能否认不如a.cast_to<string>()这样舒服的事实。
: :
: :
: : 【 在 z16166 的大作中提到: 】
: --
: 发自xsmth (iOS版)
: --
:
: ※ 来源:·水木社区
http://www.mysmth.net·[FROM: 124.217.188.*]
--
FROM 171.113.27.*