【问题标题】:Check if a type has a member function (inhrited member functions also) with Boost TTI使用 Boost TTI 检查类型是否具有成员函数(也包括继承的成员函数)
【发布时间】:2014-05-04 22:00:19
【问题描述】:

Boost TTI 有非常方便的宏来检查一个类型是否有成员函数。 See here.

但是BOOST_TTI_HAS_MEMBER_FUNCTION 为继承的成员函数返回 false。有没有方便的 Boost 解决方案?

我知道自定义SFINAE solution 的现有线程。但我更喜欢 Boost 解决方案,因为这样我更确定它适用于更多编译器,并且我希望避免为每个此类特定行为维护代码。此外,我已经在使用来自 Boost 的类似库。

【问题讨论】:

  • 这个的用例是什么?可能有更优雅的方式来实现您想要的。
  • 您可以接受非升压的 SFINAE 解决方案吗?
  • 我想已经有一个自定义SFINAE solution 的线程。但我更喜欢 Boost 解决方案,因为这样我更确定它适用于更多编译器,并且我希望避免为每个此类特定行为维护代码
  • 可能最后的答案是this SO answer,但在我看来它不能正确处理参数。

标签: c++ boost typetraits


【解决方案1】:

图书馆的创建者 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;

模板参数是:

  1. 检查成员函数的结构(例如has_member_function_function2
  2. 函数的返回类型
  3. 层次结构中的任意数量的类

2。自动生成基类

上述解决方法的缺点是您必须手动提供基类。 在练习泛型编程时,具体化是一个缺点

进行这种内省的一种方法是通过std::tr2::bases。如果您有一个支持它的实现(它将在“一段时间”内成为标准),您最终可以使用 TTI 进行自省:

has_m_f < has_member_function_function1, int, Top2,
            std::tr2::bases<Top2>::type >::value;

HTH

【讨论】:

    猜你喜欢
    • 2020-05-27
    • 2012-01-16
    • 1970-01-01
    • 1970-01-01
    • 2017-01-05
    • 1970-01-01
    • 1970-01-01
    • 2017-06-15
    • 2013-05-09
    相关资源
    最近更新 更多