检查 c++ 中是否存在函数时出现问题
我在 上找到了一些非常有趣的 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您的麻烦在于使用积分零和 typeof 。使用 MSVC10、decltype 和 nullptr,只需对此代码进行简单修改即可打印正确的值。
我不是 typeof 方面的专家,但类似这样的事情应该是可行的:
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.
I'm not an expert on typeof, but something like this should be doable: