函数的推导
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,这里不会制作任何副本。
假设我们有一个这样的 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,这里不会制作任何副本。