我有一个有很多参数的函数。(4-7个参数)
为了简单起见,这就是一个例子:
class B{
friend class C;
int f(int param1,float param2, structA a, structB b){
//... some code ...
}
//.... other functions ....
};有时,我希望将封装在具有相同签名的另一个(更公共的)函数下:-
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.组合比组合更适合边缘情况。
我觉得<...>可能解决了我的问题,但它需要模板,而我想避免它。
发布于 2017-02-28 09:27:12
但它需要模板,我想要避免。
在我看来,这是错误的心态。如果您有很好的理由这样做,您应该避免模板,否则您应该接受它们--它们是C++语言的核心特性。
使用各种模板,您可以创建一个完美的转发包装器,如下所示:
class C{
B* b;
public:
template <typename... Ts>
int g(Ts&&... xs){
return b->f(std::forward<Ts>(xs)...);
}
};上面的g函数模板将接受任意数量的参数,并通过完美地转发它们来调用b->f。
(使用std::forward允许包装器在调用包装器时正确地保留传递表达式的值类别。简而言之,这意味着不会进行不必要的复制/移动,引用也将正确地传递。)
发布于 2017-02-28 14:28:01
在公开标题中:
using f_sig = int(int param1,float param2, structA a, structB b);
class hidden;
class famous {
hidden* pImpl
public:
f_sig g;
};在.cpp中:
class hidden {
friend class famous;
f_sig f;
};现在,您不能使用此模式来定义f或g的功能,但这确实会显示它们的签名。如果您的定义与声明不匹配,则会得到一个错误。
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);
}输入上面错误的签名,您将得到一个编译时错误。
https://stackoverflow.com/questions/42504738
复制相似问题