图书馆的创建者 Edward Diener 在this thread 中告诉我们:
TTI 无法识别继承的成员函数,即使它们是公共的。
因此,既然您仍想使用 TTI,让我们做一个解决方法。我将使用类似于 BOOST 中相关手册页的示例,只有继承会添加到“问题”中:
struct AClass { };
struct Top {
int function1();
AClass function2(double, short *);
};
struct Top2 : Top {
long function2(Top &, int, bool, short, float);
Top * function3(long, int, AClass &);
};
int main()
{
cout << has_member_function_function1<Top, int>::value << endl;; // 1. true
cout << has_member_function_function1<Top2, int>::value << endl; // 2. false
return 0;
}
情况 (2) 是一个错误,因为返回 int 的名为 function1 的函数定义在 Top2 的基类 Top 中
1。检查类层次结构的机制
第一步是建立一种机制,将TTI检查应用于任意数量的类:
template <
template <class, class, class, class> class check,
typename Ret, typename... Bases
>
struct has_m_f;
template <
template <class, class, class, class> class check,
typename Ret, typename Base
>
struct has_m_f <check, Ret, Base>
{
static const bool value = check<Base, Ret,
boost::mpl::vector<>, boost::function_types::null_tag>::value;
};
template <
template <class, class, class, class> class check,
typename Ret, typename Base, typename... Bases
>
struct has_m_f <check, Ret, Base, Bases...>
{
static const bool value = check<Base, Ret,
boost::mpl::vector<>, boost::function_types::null_tag>::value
|| has_m_f<check, Ret, Bases...>::value;
};
has_m_f 是一个将任意长度的类转发到 has_member_function_... 结构的结构,它将进行检查。没有添加算法,只是一种使用存在量化提升谓词的机制:
如果层次结构中的任何类具有这样的成员函数,则返回 true
使用这个工具,在你的情况下,你可以写
has_m_f < has_member_function_function1, int, Top2, Top >::value;
模板参数是:
- 检查成员函数的结构(例如
has_member_function_function2)
- 函数的返回类型
- 层次结构中的任意数量的类
2。自动生成基类
上述解决方法的缺点是您必须手动提供基类。 在练习泛型编程时,具体化是一个缺点。
进行这种内省的一种方法是通过std::tr2::bases。如果您有一个支持它的实现(它将在“一段时间”内成为标准),您最终可以使用 TTI 进行自省:
has_m_f < has_member_function_function1, int, Top2,
std::tr2::bases<Top2>::type >::value;
HTH