模板检查是否存在超载成员功能

template to check for existence of overloaded member function

本文关键字:超载 成员 功能 存在 是否 检查      更新时间:2023-10-16

我尝试使用类似的特殊成员函数(在另一个示例中找到):

template <typename T>
class has_begin
{
    typedef char one;
    typedef long two;
    template <typename C> static one test( decltype( &C::AnyFunc) ) ;
    template <typename C> static two test(...);
public:
    enum { value = sizeof(test<T>(0)) == sizeof(char) };
    enum { Yes = sizeof(has_begin<T>::test<T>(0)) == 1 };
    enum { No = !Yes };
};

这效果很好,直到AnyFunc重载为止:

class B : public vector<int>
{
public:
    void AnyFunc() const;
    void AnyFunc();
};

如何重写我的测试代码以从模板中获取"是"?

必须将无参数的过载函数名称使用(13.4p1)解析为单个重载(13.4p4),否则将发生替换失败。

如果您正在测试成员函数的存在,那么您应该知道打算与之调用的参数:

    template <typename C> static one test(
        typename std::add_pointer<decltype(std::declval<C>().AnyFunc())>::type);

通常,您可以使用variadic模板和类似于 result_of的模式:

    template <typename C, typename... Args> static one test(
        typename std::add_pointer<decltype(
            std::declval<C>(std::declval<Args>()...).AnyFunc())>::type);

使用add_pointer允许此功能与不允许作为函数参数类型的函数类型(例如void)一起使用。

找到了有效的版本:

    template <typename C> static one test( decltype(((C*)0)->AnyFunc())* ) ;

如果要验证该对象具有const函数,请使用以下操作:

    template <typename C> static one test( decltype(((const C*)0)->AnyFunc())* ) ;

此版本将无法通过参数检测功能:

class B : public std::vector<int>
{
public:
    //void AnyFunc() const;
    //void AnyFunc();
    int AnyFunc(int);
};