- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
以下代码正确地确定何时可以为给定的 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.Write
、Writer::Write
、decltype
和 &
的所有可能的组合在 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/
有没有办法使用std::is_invocable具有任意函数参数类型,例如:std::is_invocable .这个想法是检查是否Function可以接受 1 个参数,无论参数的类型如何。对于一个用
它似乎只对这一种情况有所不同。这是怎么回事? #include void foo_value(int i){} void foo_ref(int& i){} void foo_cref(const
我有一个 if constexpr检查类型是否与自身相等。我用 std::is_invocable_v, T, T> . 然而,当 T是一个无与伦比的结构 vector ,该代码段错误地返回 True
以下代码正确地确定何时可以为给定的 T 调用 Writer( t )。 template inline void Process( const T& t ) { if constexpr (
我在以下程序中遇到 std::is_invocable 问题: #include #include void g() {} template void f(T t) { if conste
我有一个类只是将函数调用转发到另一个类,我希望能够使用 std::invocable<>在我的转发课上。但由于某种原因失败了......这是我应该期待的吗?有没有办法解决它? #include #i
我很欣赏这个 stackoverflow 问题的答案 Generic implementation of operator' requested here std::cout &dump(std
我最近偶然发现了 std::is_invocable这将被引入 C++17 标准,我想知道为什么它需要用户为函数指针提供类型,而不是只提供函数指针本身,这可能更方便,特别是因为非类型模板参数现在可以不
我有一个包含多个函数对象的库,这些函数对象可能只接受几种类型,具体取决于 std::is_integral .我要std::is_invocable在条件失败时返回 false,但当用户尝试调用函数对
在 C++17 中我知道我可以写: #include struct A { size_t operator()(double x) const { return 1; }; }; int mai
我想使用 std::is_invocable,但是我们使用的是 c++11 标准,而 is_invocable 仅适用于 c++17。 有什么方法可以使用 c++11 模拟功能吗? 谢谢 最佳答案 您
以下程序的输出似乎自相矛盾: #include #include #include void foo(int&){ std::cout //
cppref已删除 std::is_callable 的入口页面, 并使用 std::is_invocable而是进入页面。 但是,std::is_callable在 Visual Studio 20
std::is_invocable, std::decay_t>::value 评估为假。 但 void(int&)衰减到void*(int&) 和int至int 我可以这样使用std::invoke
问题 我写了一段可以编译的复杂模板代码with GCC 8.2.1 , 但不是 with Clang 7.0 (代码和错误链接)。 我认为这可能是 this Q&A 的暗示, 但我看不到它。 动机 我
我是一名优秀的程序员,十分优秀!