C++ 具有多重继承和太多公共访问权限的代码
我有以下定义函子合成的代码块C++ 具有多重继承和太多公共访问权限的代码,c++,inheritance,functional-programming,friend,template-meta-programming,C++,Inheritance,Functional Programming,Friend,Template Meta Programming,我有以下定义函子合成的代码块 #pragma once #include <tuple> template<typename Args,std::size_t A,typename...F> class _compose{}; template<typename...Args,std::size_t A,typename F,typename...G> class _compose<std::tuple<Args...>,A,F,G...
#pragma once
#include <tuple>
template<typename Args,std::size_t A,typename...F>
class _compose{};
template<typename...Args,std::size_t A,typename F,typename...G>
class _compose<std::tuple<Args...>,A,F,G...>
:private _compose<std::tuple<Args...>,A-1,G...>{
const F f;
public:
_compose(F _f,G...g):_compose<std::tuple<Args...>,A-1,G...>(g...),f(_f){};
constexpr auto operator()(Args...args) const{
return f(_compose<std::tuple<Args...>,A-1,G...>::operator()(args...));
}
};
template<typename...Args,typename F>
class _compose<std::tuple<Args...>,1,F>{
const F f;
public:
_compose(F _f):f(_f){};
constexpr auto operator()(Args...args) const{
return f(args...);
}
};
template<typename...Args>
struct compose{
template<typename...Fs>
constexpr auto operator()(Fs...f){
return _compose<std::tuple<Args...>,sizeof...(Fs),Fs...>(f...);
}
};
#pragma一次
#包括
模板
类_{};
模板
课堂作文
:私人{
常数F;
公众:
_组合(F(F,G,G):(F)组合(G),F(F){};
constexpr自动运算符()(Args…Args)const{
返回f(_compose::operator()(args…);
}
};
模板
课堂作文{
常数F;
公众:
_组成(F(F)):F((F{});
constexpr自动运算符()(Args…Args)const{
返回f(args…);
}
};
模板
结构组合{
模板
constexpr自动运算符()(Fs…f){
返回(f…);
}
};
使用函子定义,例如:
template<typename T>
struct func1{
constexpr auto operator()(T x){return x+1;}
};
template<int I,typename T>
class func2{
const int i,j;
public:
func2(int _j):i(I),j(_j){};
constexpr auto operator()(T x){return x+i+j;}
};
模板
结构函数1{
constexpr自动运算符()(tx){返回x+1;}
};
模板
第2类{
常数i,j;
公众:
func2(int_j):i(i),j(_j){};
constexpr自动运算符()(tx){返回x+i+j;}
};
我可以编写compose()(func1(),func2(1))(1)
以返回4
现在问题是:这是一个薄弱的实现吗?
1.我走了多重继承的道路,每个\u compose
继承\u compose
的“向下”继承,一直到\u compose
。这感觉像是一个优雅的解决方案,但我不确定的警告。我知道多重继承通常是不受欢迎的。
2.我无法使\u compose
构造函数对外界更加隐藏。我尝试将compose
函数设置为friend
,但没有编译任何尝试。请注意,\u compose::operator()
是公共的,因为compose
函数返回一个\u compose
对象
如有任何改进上述代码的建议,我们将不胜感激。请注意,我是在g++-std=c++1y
下编译的
谢谢,多重继承是指一个类从多个基类继承-您所拥有的只是一个(非常长的)单一继承链(可能仍然不鼓励这种继承,但原因与不鼓励多重继承的原因不同)。第二个模板应该从
compose
或\u compose
继承吗?compose
只是一个代理,可以轻松构造\u compose
对象\u compose
应该继承自\u compose
。e、 g.\u compose
继承自\u compose
。但在您继承自compose
的代码中,我发现一个错误,未找到其名称。我的错误并相应地进行了编辑。。。