Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用SFINAE检查成员函数并调用它_C++_C++17_Sfinae - Fatal编程技术网

C++ 使用SFINAE检查成员函数并调用它

C++ 使用SFINAE检查成员函数并调用它,c++,c++17,sfinae,C++,C++17,Sfinae,我试图了解SFINAE是如何工作的 我的需要: 我有一组类型,可以提供或不提供名为activate的成员函数。问题是,如果给定类型的activate确实存在,它可能会接受任何参数。我想写一个函数,它将转发到类型的activate,如果它存在,否则只需返回true 我试过: #include <iostream> #include <utility> #include <functional> struct A { bool activate()

我试图了解SFINAE是如何工作的

我的需要:

我有一组类型,可以提供或不提供名为
activate
的成员函数。问题是,如果给定类型的
activate
确实存在,它可能会接受任何参数。我想写一个函数,它将转发到类型的
activate
,如果它存在,否则只需
返回true

我试过:

#include <iostream>
#include <utility>
#include <functional>

struct A
{
    bool activate()
    {   
        std::clog << "A::activate() called" << std::endl;
        return true;
    }   

    bool activate(const char*)
    {   
        std::clog << "A::activate(const char*) called" << std::endl;
        return true;
    }   
};

struct B
{
    // NOTHING
};

template<class S, class... ARGS>
auto activate(S& s, ARGS&&... p_args) -> typename std::invoke_result<decltype(&S::activate)(S, ARGS...)>::type
{
    return s.activate(std::forward<ARGS>(p_args)...);
}

bool activate(...)
{
    return true;
}


int main(int argc, char* argv[])
{
    A a;
    B b;

    activate(a);
    activate(a, "Hello");
    activate(b);

    return 0;
}
#包括
#包括
#包括
结构A
{
bool activate()
{   
std::clog您的问题在于:

template<class S, class... ARGS>
auto activate(S& s, ARGS&&... p_args)
    -> typename std::invoke_result<decltype(&S::activate)(S, ARGS...)>::type
//                                          ^^^^^^^^^^^^

这一方面解决了重载名称的问题,以及如何使用
invoke\u result

有趣的是,在cppreference上读了十遍之后,我仍然没有看到
invoke\u result
result\u的
result\u的语法不一样。是的,对于地址,它是有意义的。谢谢。
template<class S, class... ARGS>
auto activate(S& s, ARGS&&... p_args)
    -> decltype(s.activate(std::forward<ARGS>(p_args)...))