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)
太好了.但是,如果我不确定是否base有func()?即因为我正在进行模板元编程,我实际上并不确定是什么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_if想boost::enable_if.似乎不可能......
提前致谢.
我想我需要做类似的事情
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。就我而言,必要时我也许可以让它派生出来。但还是差强人意。
| 归档时间: |
|
| 查看次数: |
226 次 |
| 最近记录: |