其他分享
首页 > 其他分享> > c – 为什么在SFINAE期间需要参数中的指针?

c – 为什么在SFINAE期间需要参数中的指针?

作者:互联网

为什么我需要*来使检查器成为指针在线

模板< typename C> static yes test(checker< C,& C :: helloworld> *);

为了使编译时间扣除正常工作,输出1 0?

当我删除*时,输出为0 0

#include <iostream>

struct Generic {}; 
struct Hello
{ int helloworld() { return 0; } };

// SFINAE test
template <typename T>
class has_helloworld
{
    typedef char                yes;
    typedef struct {char _[2];}  no; 

    template <typename C, int (C::*)()> struct checker;

    template <typename C> static yes test( checker<C, &C::helloworld>* );
    template <typename C> static no  test(...);

public:
    enum { value = sizeof(test<T>(0)) == sizeof(yes) };
};

int main(int argc, char *argv[])
{
    std::cout << has_helloworld<Hello>::value   << std::endl;
    std::cout << has_helloworld<Generic>::value << std::endl;
    return 0;
}

这是我试图整理这两个帖子的练习:

Is it possible to write a template to check for a function’s existence?

Check if a class has a member function of a given signature

解决方法:

因为它被称为test< T>(0),并且如果test将指针作为参数类型(作为检查器< C,& C :: helloworld> *),则可以接受0作为空指针.

如果你删除*使参数类型为checker< C,& C :: helloworld&gt ;,则test< T>(0)只能匹配test(…),那么你总是得到结果0.

标签:c98,c,templates,sfinae,c03
来源: https://codeday.me/bug/20190827/1745586.html