- 主题:标准库为什么不喜欢用方法,喜欢独立的函数?
比如下面的any, 我觉得a.cast<string>()是最顺手的方式,因为只要定义了any对象,
后面就可以自动完成,而现在any_cast设计成单独的函数,必须自己敲,很不方便。
其他类似的还有很多。c++这么设计,有什么明显的好处吗?
//--------------------------------------------------
std::any a = 1;
a = std::string("Hello world");
try {
std::cout << std::any_cast<std::string>(a) << '\n';
} catch(const std::bad_any_cast& e) {
std::cout << e.what() << '\n';
}
--
FROM 223.72.41.*
chatgpt:
C++标准库中,倾向于使用非成员函数而不是成员函数的设计哲学,主要是出于以下几个原因:
泛化能力(Generality):通过独立的函数可以使其适用于更多类型,不仅仅是特定于某个类的实例。例如,std::any_cast可以用于流式API设计模式,这种设计模式允许对各种不同的容器和类型进行操作,而不局限于某个特定的对象。
正交性(Orthogonality):将操作从类中解耦可以减少类的复杂性。通过将功能分散到独立的函数中,可以使得类设计更加集中和一致,每个类只需要关注其核心职责。这种分离有助于降低类的复杂度和提高代码的可维护性。
扩展性(Extensibility):当使用独立函数时,可以在不更改原有类定义的情况下,提供额外的操作和扩展,特别是对标准库中的类进行扩展。这可以在不破坏已有代码的情况下增加新功能。
一致性(Consistency):对于一些通用概念,如输入/输出流操作、比较操作、算法等,C++标准库倾向于使用独立功能而不是成员函数,以保持所有标准库组件之间的一致性。
避免名称污染(Name pollution):类的成员函数名称在该类的作用域中是可见的,而且通常只适合于该类。独立函数可以遵循其自有名称空间的规则,减少名称冲突的可能性。
ADL(Argument-Dependent Lookup):独立函数还可以利用C++的ADL特性。当函数和类型定义在同一命名空间时,这些函数在调用时可以自动被考虑进去,而不需要显式的类实例调用。
对于std::any来说,std::any_cast的设计既强调了以上原则,也提供了一种类型安全机制,因为它需要显式类型转换。这提醒使用者意识到潜在的类型转换错误,并且通过异常处理机制,可以在不正确的类型转换时提供清晰的错误信息,从而保证程序的健壮性。
--
FROM 222.130.138.*
说了一堆, 还是不能否认不如a.cast_to<string>()这样舒服的事实。
【 在 z16166 的大作中提到: 】
: chatgpt:
: C++标准库中,倾向于使用非成员函数而不是成员函数的设计哲学,主要是出于以下几个原因:
: 泛化能力(Generality):通过独立的函数可以使其适用于更多类型,不仅仅是特定于某个类的实例。例如,std::any_cast可以用于流式API设计模式,这种设计模式允许对各种不同的容器和类型进行操作,而不局限于某个特定的对象。
: ...................
--
FROM 223.72.41.*
不肯向便利性妥协而已。
【 在 finlab 的大作中提到: 】
: 说了一堆, 还是不能否认不如a.cast_to<string>()这样舒服的事实。
:
--
FROM 43.206.234.*
想象一下:
int.to_string()
char.to_string()
...
和
std::to_string()
【 在 KnightZorro 的大作中提到: 】
: 不肯向便利性妥协而已。
--
修改:z16166 FROM 222.130.138.*
FROM 222.130.138.*
如果要向你自定义的类型cast怎么办?独立的函数的话你可以自己写一个,成员函数你就没法自己写了
【 在 finlab 的大作中提到: 】
: 比如下面的any, 我觉得a.cast<string>()是最顺手的方式,因为只要定义了any对象,
: 后面就可以自动完成,而现在any_cast设计成单独的函数,必须自己敲,很不方便。
: 其他类似的还有很多。c++这么设计,有什么明显的好处吗?
: ...................
--
FROM 59.57.192.*
any_cast本来支持任意类型啊
如果要做其他的事情,一样可以自己写个函数
【 在 dormouseBHU 的大作中提到: 】
: 如果要向你自定义的类型cast怎么办?独立的函数的话你可以自己写一个,成员函数你就没法自己写了
--
FROM 223.72.41.*
C# 支持 extension method,可以实现你的语法
【 在 finlab (挨踢卢瑟) 的大作中提到: 】
: 说了一堆, 还是不能否认不如a.cast_to<string>()这样舒服的事实。
:
:
: 【 在 z16166 的大作中提到: 】
--
FROM 124.217.188.*
对, C#跟方面都不错。
不过C++、java程序员都鄙视C#程序员
【 在 fanci 的大作中提到: 】
: C# 支持 extension method,可以实现你的语法
--
FROM 223.72.41.*
模版化可能是一种原因。
你可以为任何一个类实现std::any_cast<T1>(T2 x)。这样std::any_cast就可以用在模版函数里,自动对T2适用。
但你可能无法为T2添加 T.cast 成员函数。
不过其实可以既要又要的。
【 在 finlab 的大作中提到: 】
: 比如下面的any, 我觉得a.cast<string>()是最顺手的方式,因为只要定义了any对象,
: 后面就可以自动完成,而现在any_cast设计成单独的函数,必须自己敲,很不方便。
: 其他类似的还有很多。c++这么设计,有什么明显的好处吗?
: ...................
--
FROM 124.207.9.*