std :: is_invocable <...> проверка функции-члена - PullRequest
1 голос
/ 17 апреля 2020

Следующий код правильно определяет, когда Writer( t ) может быть вызвано для данного T.

template <typename T>
inline void Process( const T& t )
{
    if constexpr ( std::is_invocable<decltype(Writer), const T&>::value )
    {
        Writer( t );
    }
    else { //... }
}

Но я могу заставить это работать только для operator(), определенного в Writer как, например,

class Writer
{
 public:
    operator()( const int& )
    {
        \\...
    }
}

Как я могу получить ту же проверку для члена функция , т.е. проверить, существует ли эта функция, например, для Write(...) in

class Writer
{
public:
    inline void Write( const int& t )
    {
    }
};

class Archive
{

public:

    template <typename T>
    inline void Process( const T& t )
    {
        //check if Writer can handle T
        if constexpr ( std::is_invocable_v<decltype( ???&Writer::Write??? ), ???, const T&> )
        {
            TheWriter.Write( t );
            std::cout << "found";
        }
        else
        {    
            std::cout << "not found";
        }
    }

    Writer TheWriter;

};

Каждая возможная комбинация Writer.Write, Writer::Write, decltype и &, которую я пытался выполнить if constexpr приводит к ошибке компилятора или даже fatal error C1001.

Это на Visual Studio 2017 MSVC_1916 с /std:c++17.

1 Ответ

2 голосов
/ 17 апреля 2020

Вы можете проверить функцию-член следующим образом:

template <typename T>
inline void Process( const T& t )
{
    if constexpr ( std::is_invocable_v<decltype(&Writer::Write), Writer&, T const &> )    
    {
        Writer{}.Write(t);
    }
    else 
    { 
        //... 
    }
}

Вот рабочая демо . Спасибо @aschepler за указание на ошибку в оригинальном фрагменте.

...