【发布时间】:2020-04-16 21:37:53
【问题描述】:
以下代码正确确定何时可以为给定的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(...) 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;
};
我在if constexpr 中尝试的Writer.Write、Writer::Write、decltype 和& 的每个可能组合都会导致编译器错误,甚至fatal error C1001。
这是在带有 /std:c++17 的 Visual Studio 2017 MSVC_1916 上。
【问题讨论】:
-
Writer.Write( t );行也是错误的:.的左侧必须是对象,而不是类的名称。该函数是否真的需要Writer对象,或者是否可以在不存在任何Writer对象的情况下调用它? -
模板上的
inline关键字毫无意义。模板已经具有与内联函数相同的语义(显式特化和实例化除外)。 -
抱歉,缩短了太多。当然有会员
Writer Writer编辑了这个。 -
我认为微软把这些事情搞砸的日子已经一去不复返了......无论如何,最后,我选择了一个不同的——更好的重载+SFINAE 解决方案。无论如何,这些检查都太脆弱了。
标签: c++ visual-c++ c++17 std