首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数的推导

函数的推导
EN

Stack Overflow用户
提问于 2016-07-06 16:08:15
回答 3查看 1.6K关注 0票数 32

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

代码语言:javascript
复制
template<typename F>
class A
{
public:
  template<typename... Args>
  A(F f, Args... args)
  { /* Do something... */ }
};

现在我想以某种方式使用它,比如这个:

代码语言:javascript
复制
A<int(int)> a(::close, 1);

现在的问题是:有什么方法可以省略<int(int)>,因为编译器可以知道::close的这些信息吗?没有必要保存模板的“设计”。

至于具体的任务,我需要设计一个类的模板。该类的对象可以在构造时为该函数获取函数和参数,并在以后调用该函数。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-07-06 16:13:27

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

代码语言:javascript
复制
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将引入类的模板参数推导,它将允许您做您想做的事情(另请参阅下面的巴里的回答 )。

票数 35
EN

Stack Overflow用户

发布于 2016-07-06 16:14:05

由于对构造函数采用了模板参数演绎,在C++17中,您可以只编写:

代码语言:javascript
复制
A a(::close, 1);

在此之前,您只需要编写一个工厂来为您进行扣减:

代码语言:javascript
复制
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。

票数 16
EN

Stack Overflow用户

发布于 2016-07-06 16:12:31

除非默认,否则不能省略模板类的参数。您可以做的是拥有一个maker函数,它可以演绎参数并将这个参数转发给模板类,返回一个适当实例化的对象。

代码语言:javascript
复制
template<typename F, typename... Args>
A<F> make_A(F f, Args&&... args) {
    return A<F>(f, std::forward<Args>(args)...);
}
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38228666

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档