首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用具有相同参数集的另一个函数封装函数

用具有相同参数集的另一个函数封装函数
EN

Stack Overflow用户
提问于 2017-02-28 09:23:16
回答 2查看 149关注 0票数 0

我有一个有很多参数的函数。(4-7个参数)

为了简单起见,这就是一个例子:

代码语言:javascript
复制
class B{
    friend class C;
    int f(int param1,float param2, structA a, structB b){
         //... some code ...
    }
    //.... other functions ....
};

有时,我希望封装在具有相同签名的另一个(更公共的)函数下:-

代码语言:javascript
复制
class C{
    B* b;
    public: int g(int param1,float param2, structA a, structB b){
        return b->f(param1,param2,a,b);
    }
    //.... other functions ....
};

在我看来,上述守则是:

  • 单调乏味
  • 会引起一些可维护性问题
  • 人易犯错误

是否有任何C++技术/魔术/设计模式来帮助它?

在实际情况下,大多数情况下,inheritance.组合比组合更适合边缘情况。

我觉得<...>可能解决了我的问题,但它需要模板,而我想避免它。

EN

回答 2

Stack Overflow用户

发布于 2017-02-28 09:27:12

但它需要模板,我想要避免。

在我看来,这是错误的心态。如果您有很好的理由这样做,您应该避免模板,否则您应该接受它们--它们是C++语言的核心特性。

使用各种模板,您可以创建一个完美的转发包装器,如下所示:

代码语言:javascript
复制
class C{
    B* b;
public: 

    template <typename... Ts>
    int g(Ts&&... xs){
        return b->f(std::forward<Ts>(xs)...);
    }

};

上面的g函数模板将接受任意数量的参数,并通过完美地转发它们来调用b->f

(使用std::forward允许包装器在调用包装器时正确地保留传递表达式的值类别。简而言之,这意味着不会进行不必要的复制/移动,引用也将正确地传递。)

票数 1
EN

Stack Overflow用户

发布于 2017-02-28 14:28:01

在公开标题中:

代码语言:javascript
复制
using f_sig = int(int param1,float param2, structA a, structB b);

class hidden;
class famous {
  hidden* pImpl
public:
  f_sig g;
};

在.cpp中:

代码语言:javascript
复制
class hidden {
  friend class famous;
  f_sig f;
};

现在,您不能使用此模式来定义fg的功能,但这确实会显示它们的签名。如果您的定义与声明不匹配,则会得到一个错误。

代码语言:javascript
复制
int hidden::f(int param1,float param2, structA a, structB b) {
  std::cout << "f!";
}
int famous::g(int param1,float param2, structA a, structB b) {
  return pImpl->f(param1, param2, a, b);
}

输入上面错误的签名,您将得到一个编译时错误。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42504738

复制
相关文章

相似问题

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