- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个模板方法,如果存在则执行具有固定参数值的对象的基类方法,如果不存在则不执行,并且它有效。我将 sfinae 与 std::enable_if_t 一起使用来解决方法是否存在。
我不明白的是 - 我如何传递调用方法的实际返回值,超越 std::enable_if_t。
这是我的代码的样子:
#define PREPARE_BASE_METHOD_W_2ARGS_CALL_HELPERS(METHOD_NAME, ARG1, ARG2) \
namespace detail{ \
template <typename T, typename A1, typename A2> static auto test_##METHOD_NAME(int) -> sfinae_true<decltype(std::declval<T>().METHOD_NAME(std::declval<A1>(), std::declval<A2>()))>; \
template <typename , typename A1, typename A2> static auto test_##METHOD_NAME(long) -> std::false_type; \
template <typename T, typename A1, typename A2> struct has_##METHOD_NAME : decltype(detail::test_##METHOD_NAME<T, A1, A2>(0)){}; \
template <typename Base, typename T> auto call_##METHOD_NAME##_if_any(T& obj, ARG1 arg1, ARG2 arg2) -> std::enable_if_t<has_##METHOD_NAME<Base,ARG1,ARG2>::value, bool> { \
obj.Base::METHOD_NAME(arg1, arg2); \
return true; \
} \
template <typename Base, typename T> auto call_##METHOD_NAME##_if_any(T& obj, ARG1, ARG2) -> std::enable_if_t<!has_##METHOD_NAME<Base,ARG1,ARG2>::value, bool> { return false; } \
} \
是的,它是一个宏,但我希望理解发生了什么没有问题。我在哪里以及如何从 call_##METHOD_NAME##_if_any(..) 返回 obj.Base::METHOD_NAME(arg1, arg2) 的结果?我很困惑,因为我认为这里的 return 已经被 sfinae 逻辑占据了。
最佳答案
非常简单,只需将 std::enable_if_t
放入带有默认参数的模板参数列表中,例如
template <typename Base, typename T, std::enable_if_t</*Your condition here*/, bool> = true>
然后您可以使用 decltype(auto)
作为实际的返回类型。
关于c++ - 通过 std::enable_if_t 传递被调用方法的返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36233430/
使用 typename = enable_if_t 有什么区别吗?和 enable_if_t = true对于 SFINAE?我特别问,因为我偶然发现了一个看起来像错误的东西:Compiler err
我有以下代码,我在其中使用折叠表达式来评估所有包参数是否都可以转换为第一个函数参数。出于某种原因,当我进行看似非常微不足道的更改时,它无法在 msvc 上编译: #include #define T
我试图理解为什么这段代码没有按预期工作 #include #include #include using namespace std; struct Foo { }; template void
我正在尝试做一些持久性的东西,我有一个这样的结构: struct EntityPersistence { template void persist(Archive &ar, Ent
当我尝试使用 MSCL 19 编译以下代码时,没问题。但是,当我尝试 g++ 6.2.0 和 clang 3.9.0 时,出现了类似 expected nested-name-specifier cl
我想写一个 2 重载的模板组合,如下面的代码所示,我希望在 2 上做不同的处理对象的类型。编译时出现这些错误: // Error C2672 'info': no matching over
这是我的代码: template * = nullptr> void foo(T) { std::cout * = nullptr> void foo(T) {} // #2 class te
我需要在双引号内打印所有类型的字符串数据,而其他不带双引号的字符串数据。 这是我检查参数是否为字符串的函数。 template struct is_str : std::integral_consta
我有以下使用 std::enable_if 的案例: template::value>::type* = nullptr> void f() { } template::value>::type* =
我正在阅读std::enable_if ,并注意到以下内容。 template ::value, int> = 0 > T(Integer) : m_type(int_t) {} 由于 std::en
我编写了一个接收可变数量的 std::pairs 的函数,该函数从每对的第一个元素中减去第二个元素,并从新生成的结果中返回一个元组,如下所示: template, pairs>) && ...)>*
编辑:根据反馈重写了提供的代码以帮助说明问题 说我有一个方法 template do_foo(T)并且我纯粹使用 std::enable_if 来使用它定义返回值 这允许我为它写签名,例如 // te
我有一个模板方法,如果存在则执行具有固定参数值的对象的基类方法,如果不存在则不执行,并且它有效。我将 sfinae 与 std::enable_if_t 一起使用来解决方法是否存在。 我不明白的是 -
我一直在阅读 STL 文件,以学习格式化代码的更好方法,并学习提高效率的技巧。我一直在阅读线程文件,但我无法弄清楚某些代码的作用。 template, thread>::value>> exp
我正在尝试基于一个完整的类模板参数启用不同的成员函数,如下所示: #include template struct Foo { template = 0> int bar(int i
假设我们有一些 SFINAE 成员函数: class foo{ template ::value, S> void bar(S&& s); template ::value,
目前,我对这行代码有疑问。它显示此错误消息 error: ‘std::enable_if_t’ has not been declared .我已经包含了 #include 头文件,但它仍然是一样的。
我想弄清楚为什么 SFINAE 不能使用直接模板参数初始化? 当我在此处声明另一个模板参数时,它以这种形式工作: #include template class enable_if {}; tem
更新: 谢谢你,大露营。 这是最后的 struct A . struct A { template> A(Args &&...args) { cout,A>::
考虑以下类: struct S { template std::enable_if_t::value> f() noexcept {} template std
我是一名优秀的程序员,十分优秀!