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
的代码中,我发现一个错误,未找到其名称。我的错误并相应地进行了编辑。。。