检查 c++ 中是否存在函数时出现问题

发布于 2024-10-03 05:22:23 字数 1308 浏览 6 评论 0原文

我在 上找到了一些非常有趣的 C++ 代码stackoverflow ,我对此感到非常困惑,因为正如作者所说,它应该可以工作,但在我的 gcc 4.5.1 和 4.4 上失败了:( 目标是检查类是否包含特定方法。

代码是:

#include <iostream>

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

struct Generic {};


// SFINAE test
template <typename T>
class has_helloworld
{
    typedef char one;
    typedef long two;

    template <typename C> static one test( typeof(&C::helloworld) ) ;
    template <typename C> static two test(...);


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


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

我遇到编译器错误:

ISO C++ 禁止课堂内 非常量静态的初始化 成员“测试”

另外,正如一些评论所说 - 我可以将 'typeof(&C::helloworld)' 更改为 'char[sizeof(&C::helloworld)]' 但我的输出是

1
1

错误的,因为只有一个类具有 helloworld 函数 有

没有任何方法可以使其工作? 另外,如果有人能解释这个命令的具体含义,我将非常感激:

test( char[sizeof(&C::helloworld)] ) ;

非常感谢:)

I've found some very interesting c++ code on stackoverflow and I'm very confused about it because as author says it should work and it fails on my gcc 4.5.1 and 4.4 :(
The goal is to check if class contain or not a specific method.

the code is:

#include <iostream>

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

struct Generic {};


// SFINAE test
template <typename T>
class has_helloworld
{
    typedef char one;
    typedef long two;

    template <typename C> static one test( typeof(&C::helloworld) ) ;
    template <typename C> static two test(...);


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


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

I've got compiler error:

ISO C++ forbids in-class
initialization of non-const static
member 'test'

Additional as some comment says - I can change 'typeof(&C::helloworld)' to 'char[sizeof(&C::helloworld)]'
but then my output is

1
1

what is wrong, because only one class has helloworld function

Is there any method to make it working?
Addition I would be very thankfull if somebody could explain what exactly makes this command:

test( char[sizeof(&C::helloworld)] ) ;

Thank you very much :)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

少女净妖师 2024-10-10 05:22:23

您的麻烦在于使用积分零和 typeof 。使用 MSVC10、decltype 和 nullptr,只需对此代码进行简单修改即可打印正确的值。

template <typename T>
class has_helloworld
{
    typedef char one;
    typedef long two;

    template <typename C> static one test( decltype(&C::helloworld) ) ;
    template <typename C> static two test(...);


public:
    enum { value = std::is_same<decltype(test<T>( nullptr )), char>::value };
};


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

我不是 typeof 方面的专家,但类似这样的事情应该是可行的:

struct no_type {};
// SFINAE test
template <typename T>
class has_helloworld
{
    template <typename C> static typeof(&C::helloworld) test( C* i );
    template <typename C> static no_type test(...);


public:
    enum { value = std::is_same<no_type, typeof(test<T>(0))>::value };
};

Your trouble is with the use of the integral zero and typeof. Using MSVC10, decltype, and nullptr, it's a trivial modification for this code to print the correct values.

template <typename T>
class has_helloworld
{
    typedef char one;
    typedef long two;

    template <typename C> static one test( decltype(&C::helloworld) ) ;
    template <typename C> static two test(...);


public:
    enum { value = std::is_same<decltype(test<T>( nullptr )), char>::value };
};


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

I'm not an expert on typeof, but something like this should be doable:

struct no_type {};
// SFINAE test
template <typename T>
class has_helloworld
{
    template <typename C> static typeof(&C::helloworld) test( C* i );
    template <typename C> static no_type test(...);


public:
    enum { value = std::is_same<no_type, typeof(test<T>(0))>::value };
};
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文