函数的推导

Deduction of the function

假设我们有一个这样的 class 模板:

template<typename F>
class A
{
public:
  template<typename... Args>
  A(F f, Args... args)
  { /* Do something... */ }
};

现在我想像这样使用它:

A<int(int)> a(::close, 1);

现在的问题是:是否有任何方法可以省略 <int(int)>,因为编译器可以知道 ::close 的此信息?不需要保存模板的"design"。

具体的任务,我需要设计一个class的模板。这个 class 的对象可以在构造时接受一个函数和这个函数的参数,然后再调用这个函数。

您不能省略模板的参数 class,除非它们是默认的。你可以做的是有一个 maker 函数,它推导参数并将这个参数转发给模板 class,返回一个适当实例化的对象。

template<typename F, typename... Args>
A<F> make_A(F f, Args&&... args) {
    return A<F>(f, std::forward<Args>(args)...);
}

不,你(目前)不能。这样做的标准方法是创建 "make_like" 函数(例如 make_pair, make_optional ...):

template<typename F, typename... Args>
A<std::decay_t<F>> make_A (F &&f, Args&&... args) {
    return {std::forward<F>(f), std::forward<Args>(args)...};
}

C++17下面会介绍template argument deduction for class which will allow you to do exactly what you want (see also )。

由于采用了构造函数的模板参数推导,在 C++17 中,您只需编写:

A a(::close, 1);

在此之前,你只需要写一个工厂来为你做推导:

template <class F, class... Args>
A<std::decay_t<F>> make_a(F&& f, Args&&... args) {
    return {std::forward<F>(f), std::forward<Args>(args)...};
}

auto a = make_a(::close, 1);

这有点冗长,但至少您不必担心效率问题 - 由于 RVO,这里不会制作任何副本。