从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的评论中指出,我在写作时误用了 initialize 一词:
导出用于初始化它的实际类型
我感兴趣的是模板参数确实
例如,对于std::function<void(S&, int)>
(其中S
是结构体),function_type
将是void(S&, int)
。
答案 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);
此处,您无法保证Callable
是std::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 是您正在寻找的单词。您正在寻找模板实例化的类型。
唯一知道它不是会员类型的人是设计该功能的人和那些投票的人(可能)。它可能只是没人想到的东西。这似乎有点显而易见,但从想要它的角度来看,这是事后回顾。