5

如果一个类有一个像这样的特殊成员函数,我会尝试专门化一个模板(在另一个例子中找到):

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();
};

如何重写我的测试代码以从我的模板中获得“是”?

4

2 回答 2

2

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

如果您正在测试成员函数的存在,那么您应该知道您计划调用它的参数:

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

通常,您可以使用可变参数模板和类似于以下的模式result_of

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

Usingadd_pointer允许它处理不允许作为函数参数类型的函数返回类型(例如void)。

于 2012-11-12T14:10:37.697 回答
1

找到有效的版本:

    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);
};
于 2012-11-12T11:37:21.370 回答