所以如果我给它
A(B,C)
,它将通过
A
对于参数
R
和
B,C
对于可变参数
Args
。
是的,但不是因为你想的原因。如果你仔细看,你会看到的
std::function
部分专用于任何函数类型:
template<typename R, typename... Args>
class function<R(Args...)>;
// ^^^^^^^^^^^^
您可以将其想象为非常原始的模式匹配。如果您实例化
function
具有
int(int, double)
,那么有意义的是
R
是
int
和
参数
是
int, double
。如果(部分)专门化比catch-all泛型主模板更好匹配,那么就会选择它,这就是这里发生的情况。
请记住:
double(double)
是一种类型,是一种函数。没有任何特殊规则涉及它。因此,在您的情况下,您可以这样做:
template<typename R, typename... Args>
class Delayed<R(Args...)> : public Delayed<R, Args...> {
// ^^^^^^^^^^^^
// partially specialize to decompose function types
// We need to inherit constructors (only).
using Delayed<R, Args...>::Delayed;
};
希望它能消除困惑。