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

时间:2016-04-08 20:56:24

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

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的评论中指出,我在写作时误用了 initialize 一词:

  

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

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

2 个答案:

答案 0 :(得分:6)

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

如果您编写的函数模板可以接受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)?答案是标准具有容器类型必须满足的一组特定要求,这反映了设计目标,即应该可以编写适用于不同类型容器的通用算法,而不是所有容器都是模板特化形式为C<T>。然后有必要强制所有容器都公开value_type,因为这是从任意容器中提取元素类型的唯一统一方法。

如果std::function也是某个Callable概念的实例,那么要求存在function_type typedef以便代码接受任何Callable是有意义的。可以访问函数类型。但情况并非如此,只有单一模板std::function才能使用它。

答案 1 :(得分:3)

你可以轻松写一个:

# -*- coding: utf-8 -*-
import time
import nltk

def task_waiter(a):
    time.sleep(a)
    return dict()

def task_add(a,b):
    return a+b

def b(a):

    return dict()

def d(a):
    return dict()

from gluon.scheduler import Scheduler
scheduler = Scheduler(DTtaskDb)

在您的术语上: instantiate 是您正在寻找的单词。您正在寻找模板实例化的类型。

唯一知道它不是会员类型的人是设计该功能的人和那些投票的人(可能)。它可能只是没人想到的东西。这似乎有点显而易见,但从想要它的角度来看,这是事后回顾。