gpt4 book ai didi

c++ - 通过 std::enable_if_t 传递被调用方法的返回值

转载 作者:行者123 更新时间:2023-11-28 05:45:50 25 4
gpt4 key购买 nike

我有一个模板方法,如果存在则执行具有固定参数值的对象的基类方法,如果不存在则不执行,并且它有效。我将 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/

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