【问题标题】:Why std::function has no function_type or equivalent member type?为什么 std::function 没有 function_type 或等效成员类型?
【发布时间】:2016-04-08 20:56:23
【问题描述】:

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


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

编辑

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

导出用于初始化它的实际类型

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

【问题讨论】:

  • 对于is_same检查,你可以简单地检查F1F2是否是同一类型,不是吗?
  • @Brian 是的,当然,请注意我的评论我承认这没有多大意义!! :-) ...我只是想知道是否有原因它不是函数接口的一部分,即使我找不到它的合理用途,这已经很好了确实是回应。我不确定 it's useless 是否是唯一合理的回应,或者是否还有其他原因。就是这样。

标签: c++ c++11 std-function


【解决方案1】:

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

例如,如果您编写了一个可以接受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&lt;T&gt; 具有typedef T function_type,您也不希望访问Callable::function_type 以获取任意可调用对象。所以这里没有任何用处。

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

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

【讨论】:

    【解决方案2】:

    你可以轻松写一个:

    template < typename T >
    struct function_type;
    
    template < typename Sig >
    struct function_type<std::function<Sig>> { using type = Sig; };
    

    根据您的术语:instantiate 是您要查找的词。您正在寻找模板被实例化的类型。

    唯一知道为什么它不是会员类型的人是设计该功能的人和投票支持它的人(也许)。这可能只是没有人想到的事情。这似乎有点明显,但从想要它的角度来看,这是事后看来。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-10
      • 2019-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-17
      • 2019-04-26
      • 1970-01-01
      相关资源
      最近更新 更多