我需要像"使用Base ::*;"这样的东西

Ton*_*ony 7 c++ metaprogramming

如果我的基类有一个函数func(int)而我的派生类有一个函数func(double),那么派生的func(double)隐藏base::func(int).我可以使用using将基本版本带入derive的重载列表:

struct base
{
   void func(int);
};

struct derived : base
{
   using base::func;
   void func(double);
}
Run Code Online (Sandbox Code Playgroud)

太好了.但是,如果我不确定是否basefunc()?即因为我正在进行模板元编程,我实际上并不确定是什么base,但我想将它的功能提升到同一水平 - 如果它们存在的话.即将以上示例更改为:

struct base_with
{
   void func(int);
};
struct base_without
{
};

template <typename Base>
struct derived : Base
{
   using Base::func;  // if Base has a func(), I want to bring it in

   void func(double);
}

derived<base_with> testwith; // compiles
derived<base_without> testwithout;  // fails :-(
Run Code Online (Sandbox Code Playgroud)

我需要using_ifboost::enable_if.似乎不可能......

提前致谢.

ton*_*ony 0

我想我需要做类似的事情

struct dummy_func
{
private:
   struct dumb_type {};

// interesting: does this need to be public?
public:
   // use a type that no one can see, so func is never chosen by ADT
   // and vararg just for paranoia
   void func(dumb_type, dumb_type, dumb_type,...) { };
};

...
template <typename T>
struct has_func
{
   enum { value = /* insert metaprogramming magic that checks for T::func */ }
};

template <typename Base>
struct derived : Base
{
   using enable_if<has_func<Base>, Base, dummy_func>::type::func;
   ...
};
Run Code Online (Sandbox Code Playgroud)

咕噜。当然这不起作用,因为 dummy_func 不是 的基础derived。就我而言,必要时我也许可以让它派生出来。但还是差强人意。