检查模板参数是否有成员函数

发布于 2024-10-05 14:57:57 字数 954 浏览 2 评论 0原文

可能的重复:
是否可以编写检查函数是否存在的 C++ 模板?

这与我的 之前的问题。我想检查模板参数是否包含成员函数。

我尝试了与上一个问题中接受的答案类似的代码。

struct A
{
   int member_func();
};

struct B
{
};

template<typename T>
struct has_member_func
{
   template<typename C> static char func(???); //what should I put in place of '???'
   template<typename C> static int func(...);

   enum{val = sizeof(func<T>(0)) == 1};
};

int main()
{
    std::cout<< has_member_func<B>::val; //should output 0
    std::cout<< has_member_func<A>::val; //should output 1
}

但我不知道应该用什么来代替 ??? 才能使其正常工作。 我对 SFINAE 概念很陌生。

Possible Duplicate:
Is it possible to write a C++ template to check for a function's existence?

This is very similar to my earlier question. I want to check whether a template argument contains a member function or not.

I tried this code similar to that in the accepted answer in my previous question.

struct A
{
   int member_func();
};

struct B
{
};

template<typename T>
struct has_member_func
{
   template<typename C> static char func(???); //what should I put in place of '???'
   template<typename C> static int func(...);

   enum{val = sizeof(func<T>(0)) == 1};
};

int main()
{
    std::cout<< has_member_func<B>::val; //should output 0
    std::cout<< has_member_func<A>::val; //should output 1
}

But I have no idea what should I put in place of ??? to make it work.
I am new to SFINAE concept.

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

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

发布评论

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

评论(1

抱猫软卧 2024-10-12 14:57:57

对 MSalters 的想法进行了一些修改 是否可以编写一个 C++ 模板来检查函数是否存在?

template<typename T>
class has_member_func
{
        typedef char no;
        typedef char yes[2];
        template<class C> static yes& test(char (*)[sizeof(&C::member_func)]);
        template<class C> static no& test(...);
public:
        enum{value = sizeof(test<T>(0)) == sizeof(yes&)};
};

Little modification of MSalters' idea from Is it possible to write a C++ template to check for a functions existence? :

template<typename T>
class has_member_func
{
        typedef char no;
        typedef char yes[2];
        template<class C> static yes& test(char (*)[sizeof(&C::member_func)]);
        template<class C> static no& test(...);
public:
        enum{value = sizeof(test<T>(0)) == sizeof(yes&)};
};
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文