gpt4 book ai didi

c++ - std::is_invocable<...> 检查成员函数

转载 作者:行者123 更新时间:2023-12-01 14:43:04 24 4
gpt4 key购买 nike

以下代码正确地确定何时可以为给定的 T 调用 Writer( t )

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

但我只能让它为 Writer 中定义的 operator() 工作,例如

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

如何对成员函数进行相同的检查,即检查该函数是否存在,例如对于 Write(...)

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.WriteWriter::Writedecltype& 的所有可能的组合在 if constexpr 中导致编译器错误甚至 fatal error C1001

这是在带有/std:c++17 的 Visual Studio 2017 MSVC_1916 上。

最佳答案

您可以像这样检查成员函数:

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
{
//...
}
}

这是一个有效的 demo .感谢@aschepler 指出原始片段中的错误。

关于c++ - std::is_invocable<...> 检查成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61260441/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com