假设我们有这样一个类模板:
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的这些信息吗?没有必要保存模板的“设计”。
至于具体的任务,我需要设计一个类的模板。该类的对象可以在构造时为该函数获取函数和参数,并在以后调用该函数。
发布于 2016-07-06 16:13:27
不,你(目前)不能。这样做的标准方法是创建"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将引入类的模板参数推导,它将允许您做您想做的事情(另请参阅下面的巴里的回答 )。
发布于 2016-07-06 16:14:05
由于对构造函数采用了模板参数演绎,在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。
发布于 2016-07-06 16:12:31
除非默认,否则不能省略模板类的参数。您可以做的是拥有一个maker函数,它可以演绎参数并将这个参数转发给模板类,返回一个适当实例化的对象。
template<typename F, typename... Args>
A<F> make_A(F f, Args&&... args) {
return A<F>(f, std::forward<Args>(args)...);
}https://stackoverflow.com/questions/38228666
复制相似问题