Ser*_*sak 32 c++ templates c++11 type-deduction
假设我们有一个这样的类模板:
template<typename F>
class A
{
public:
template<typename... Args>
A(F f, Args... args)
{ /* Do something... */ }
};
Run Code Online (Sandbox Code Playgroud)
现在我想以某种方式使用它:
A<int(int)> a(::close, 1);
Run Code Online (Sandbox Code Playgroud)
现在的问题是:有没有办法省略,<int(int)>
因为编译器可以知道这些信息::close
?无需保存模板的"设计".
至于具体的任务,我需要设计一个类的模板.此类的对象可以在构造时获取此函数的函数和参数,并稍后调用此函数.
Hol*_*olt 35
不,你(现在)不能.执行此操作的标准方法是创建"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)...};
}
Run Code Online (Sandbox Code Playgroud)
C++ 17将为类引入模板参数推导,这将允许您完全按照自己的意愿执行操作.
Bar*_*rry 16
由于采用了构造函数的模板参数推导,在C++ 17中,您将能够只写:
A a(::close, 1);
Run Code Online (Sandbox Code Playgroud)
在此之前,你只需要写一个工厂来为你做演绎:
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);
Run Code Online (Sandbox Code Playgroud)
这有点冗长,但至少你不需要担心效率 - 由于RVO,这里不会有副本.
Ben*_*ley 11
您不能省略模板类的参数,除非它们是默认的.你可以做的是有一个maker函数,它推导出参数并将这个参数转发给模板类,返回适当实例化的对象.
template<typename F, typename... Args>
A<F> make_A(F f, Args&&... args) {
return A<F>(f, std::forward<Args>(args)...);
}
Run Code Online (Sandbox Code Playgroud)