gpt4 book ai didi

c++ - 为什么 std::function 没有 function_type 或等效的成员类型?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:18:08 26 4
gpt4 key购买 nike

来自 here在我看来 std::function没有 function_type或等效的成员类型导出用于初始化它的实际类型。
它有 result_type , argument_type ,以及 first_argument_typesecond_argument_type ,但与上述类型完全不同。
为什么它不提供这种类型作为其接口(interface)的一部分?
肯定会有一个很好的理由,但我不知道是什么原因,所以我很想知道。


因为我知道第一个问题是为什么需要它,好吧,想象一下我想做类似 std::is_same<F1::function_type, F2::function_type>::value 的事情在 sfinae 评估中检查它们的基础类型是否相同,只要符号相同,它们包含不同的功能就可以了。
我承认这没有多大意义,老实说这个问题只是出于好奇。

编辑

正如@Brian 在 his answer 的评论中指出的那样, 我在写的时候误用了 initialize 这个词:

to export the actual type used to initialize it

我真正感兴趣的是模板参数。
例如,对于 std::function<void(S&, int)> (其中 S 是一个结构),function_type将是 void(S&, int) .

最佳答案

我认为你问错了问题。正确的问题是:为什么要有这样的成员类型?

比方说,如果您编写了一个可以接受 std::function 的任何特化的函数模板,那么模板参数将立即可供您使用:

template <typename T>
void f(std::function<T> F) {
// you wouldn't write decltype(F)::function_type here; you'd just write T
}

更不方便的情况是你有一些功能,比如

template <typename Callable>
void f(Callable C);

在这里,你不能保证Callablestd::function特化,所以即使std::function<T>typedef T function_type ,您不想访问 Callable::function_type对于任意可调用对象。所以它在这里没有任何用处。

正确的问题是:为什么一些标准库类公开它们的模板参数,例如 T 的容器(哪些有 typedef T value_type )?答案是该标准有一组容器类型必须满足的特定要求,这反射(reflect)了一个设计目标,即应该可以编写适用于不同类型容器的通用算法,而不是所有容器都是模板特化形式 C<T> .然后强制所有容器公开 value_type 是有意义的因为这是从任意容器中提取元素类型的唯一统一方式。

如果std::function也是一些 Callable 的实例概念,要求有一个 function_type 是有意义的typedef 以便代码接受任何 Callable可以访问函数类型。但事实并非如此,仅对单个模板 std::function 使用它是没有用的。 .

关于c++ - 为什么 std::function 没有 function_type 或等效的成员类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36509229/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com