我想知道是否有人可以解释如何在给定类型T
和X
的情况下,std::function
将T(X)
作为模板参数。
int(double)
看起来像是从double
到int
的常规演员,那么std::function
如何将其解析为不同的类型?
我做了搜索,但没有发现任何专门解决这个问题的内容。谢谢!
答案 0 :(得分:2)
它可以使用部分模板专业化。看看这个:
template <typename T>
class Func;
template <typename R, typename... Args>
class Func<R(Args...)>
{
public:
Func(R(*fptr)(Args...)) {/*do something with fptr*/}
};
此类采用单个模板参数。但除非它匹配R(Args...)
(即返回R且取零或多个args的函数类型),否则不会有类的定义。
int main() { Func<int> f; }
// error: aggregate 'Func<int> f' has incomplete type and cannot be defined
int func(double a) { return a+2; }
int main() { Func<int(double)> f = func; }
// ok
专业化现在可以在R
和Args
上运作,以实现其魔力。
请注意int(double)
是一种函数类型。由于无法创建原始函数对象,因此通常不会在模板世界之外看到此语法。如果T
为int(double)
,则T*
是一个函数指针,就像int(*)(double)
一样。