代码之家  ›  专栏  ›  技术社区  ›  skypjack

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

  •  4
  • skypjack  · 技术社区  · 8 年前

    从…起 here 在我看来 std::function 没有 function_type 或等效的成员类型来导出用于初始化它的实际类型。
    它有 result_type , argument_type 以及 first_argument_type second_argument_type ,但与上述类型不同。
    为什么它不提供这种类型作为其接口的一部分?
    肯定会有一个很好的原因,但我不知道是什么原因,所以我只是好奇地想找出原因。


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

    编辑

    正如@Brian在评论中指出的 his answer ,我误用了这个词 初始化 当我写道:

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

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

    2 回复  |  直到 7 年前
        1
  •  6
  •   Brian Bi    8 年前

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

    例如,如果您编写了一个函数模板,它可以接受 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);
    

    在这里,你不能保证 Callable 是一个 std::函数 专业化,所以即使 std::function<T> typedef T function_type ,您不想访问 Callable::function_type 用于任意可调用。所以它在这里没有任何用处。

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

    如果 std::函数 也是一个例子 可调用的 在概念上,要求有一个 function_type typedef,以便代码接受任何 可调用的 可以访问函数类型。但情况并非如此,仅为单个模板使用它是没有用的 std::函数 .

        2
  •  3
  •   Edward Strange    8 年前

    您可以轻松地编写一个:

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

    根据您的术语: 实例化 就是你要找的词。您正在查找模板的类型 实例化 具有

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