通过std::enable_if_t传递被调用方法的返回值
passing return value of a called method throug std::enable_if_t
我有一个模板方法,它执行对象的基类方法,如果存在,则使用固定值的参数;如果不存在,则执行a和not,并且它有效。我使用带有std::enable_if_t的sfinae来解决是否存在方法。
我不知道的是,如何传递调用方法的实际返回值,而不是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; }
}
是的,这是一个宏观问题,但我希望理解发生了什么不会有问题。在何处以及如何从调用_##METHOD_NAME#_if_any(..)返回obj.Base::METHOD_NAME(arg1,arg2)的结果?我很困惑,因为我认为,这里的回归已经被sfinae逻辑占据了。
这很简单,只需将std::enable_if_t
放在模板参数列表中,并使用默认参数,例如
template <typename Base, typename T, std::enable_if_t</*Your condition here*/, bool> = true>
然后,您可以使用decltype(auto)
作为实际返回类型。
相关文章:
- 在c++中多次调用方法
- 如何确保在使用基于布尔值的两个方法之一调用方法时避免分支预测错误
- 接收字符串并使用它来调用方法C++
- 使用 gmock c++ 在真实对象上调用方法
- 不带预处理器的调用方法/文件的文件名/行号
- JNI从Android调用C++方法
- 在 C++ 的 Switch Case 中创建对象后对对象调用方法
- 如何使用接口指针调用方法,该指针是其具体类的一部分,而不是接口的一部分
- 从内部类中的方法从包含类调用方法
- 在销毁期间从另一个线程调用对象上调用方法是否未定义行为?
- 为什么派生类的实例从基类调用方法?
- 实例化对象并调用方法,使用单行语法在 C# 或 C++ 中返回值?
- C++当您取消引用指向类对象的指针,然后将其作为引用返回时,是否可以对此引用调用方法
- 通过模板函数对未知类型调用方法
- 从基于迭代器的for循环转换后,如何在map::find()中调用方法
- 创建一个C++DLL以从C#DLL调用方法
- 如何从qt中的类中调用方法
- 如何在不迭代的情况下对数组中的每个元素调用方法
- C++11 - 获取编译时的所有类变量,并在没有 Boost 的情况下为它们调用方法
- C ++:如何在不创建对象的情况下在主函数中调用方法