Следующий код правильно определяет, когда 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.