C++ 递归取消隐藏基类成员

C++ 递归取消隐藏基类成员,c++,templates,inheritance,c++11,template-meta-programming,C++,Templates,Inheritance,C++11,Template Meta Programming,我尝试编写一个类,该类将一组函数作为其参数,并为函数的所有参数类型重载运算符()。现在看起来是这样的: template<typename T> struct holder { T t; }; template<typename T, std::size_t i> struct overload_helper : public holder<T>, public overload_helper<T, i - 1> { overload_h

我尝试编写一个类,该类将一组函数作为其参数,并为函数的所有
参数类型
重载
运算符()。现在看起来是这样的:

template<typename T>
struct holder {
  T t;
};

template<typename T, std::size_t i>
struct overload_helper : public holder<T>, public overload_helper<T, i - 1> {
  overload_helper(T t) : holder<T>({t}) {};
  typedef typename std::tuple_element<i - 1, T>::type inner_type;
  typename inner_type::result_type operator()(typename inner_type::argument_type x) { 
    return std::get<i - 1>(holder<T>::t)(x); }
};

template<typename T>
struct overload_helper<T, 1> {
  typedef typename std::tuple_element<0 ,T>::type inner_type;
  typename inner_type::result_type operator()(typename inner_type::argument_type x) { 
    return std::get<0>(holder<T>::t)(x); }
};

template<typename T>
struct overload : public overload_helper<T, std::tuple_size<T>::value>
{
  typedef void result_type;
  overload(const T& t) : overload_helper<T, std::tuple_size<T>::value>(t) { }
};


int main() {
  auto all = make_overload(std::make_tuple(
                 std::function<void(double)>([](double i) { 
                 std::cout << "double" << std::endl;
                   }), std::function<void(int)>([](int i) { 
                   std::cout << "int" << std::endl; })));

  all(1); //fails
  all(1.0);
}
模板
结构持有者{
T;
};
模板
结构重载\u帮助程序:公共持有者,公共重载\u帮助程序{
重载辅助器(T T):保持器({T}){};
typedef typename std::tuple_元素::type internal_type;
typename内部类型::结果类型运算符()(typename内部类型::参数类型x){
返回std::get(holder::t)(x);}
};
模板
结构重载辅助程序{
typedef typename std::tuple_元素::type internal_type;
typename内部类型::结果类型运算符()(typename内部类型::参数类型x){
返回std::get(holder::t)(x);}
};
模板
结构重载:公共重载\u帮助程序
{
typedef void result_type;
重载(const T&T):重载(T){
};
int main(){
auto all=make_重载(标准::make_元组(
std::函数([](双i){

std::cout
在每个
重载辅助对象中使用重载辅助对象::操作符()
应该可以完成这项工作,只要它们没有歧义。

您是否尝试过在模板中添加
使用base::operator()
来取消隐藏它?这似乎有效,现在我得到了“非静态数据成员的无效使用”这表明继承层次结构有问题。谢谢。@pmr:您可能应该接受这个答案,如果您无法找出问题所在,则可以继续下一个答案。您得到的错误与此处的原始问题完全无关。(顺便说一句:这个错误通常意味着你试图在没有对象的情况下调用一个成员函数,也就是说,
struct test{foo(){};int main(){test::foo();}
)@David,情况并非如此。我的代码还有其他问题,我首先解决了这些问题,以确认Xeo的答案确实是正确的。