gpt4 book ai didi

c++ - 根据 lambda 签名选择类型

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:43:22 25 4
gpt4 key购买 nike

我正在尝试根据 lambda 表达式的签名确定类型。

我想出了下面的代码,它可以工作,但我想知道是否有更简单的方法来实现它。我已经发布了 a full working example on ideone .

template <typename T_Callback>
class CallbackType {
private:
template <typename T>
static CallbackFunctionA<T> testlambda(void (T::*op)(A const &) const);
template <typename T>
static CallbackFunctionB<T> testlambda(void (T::*op)(B const &) const);

template <typename T>
static decltype(testlambda<T>(&T::operator())) testany(int);
template <typename T>
static T &testany(...);
public:
typedef decltype(testany<T_Callback>(0)) type;
};

简而言之,T_Callback 可以是:

  • [](A const &) { } 形式的 lambda
  • [](B const &) { } 形式的 lambda
  • Callback 类的实例或派生类

T_Callback 是一个 lambda,应该返回派生自 Callback 的包装类(CallbackFunctionACallbackFunctionB ),否则应返回对回调类型本身的引用。

正如我所说,上面的代码工作得很好,但我想知道是否可以简化它,即通过消除对 testanyteSTLambda 函数的需要。

最佳答案

你说你想要什么:

  • [](A const &) { } 形式的 lambda 应映射到 CallbackFuncionA
  • [](B const &) { } 形式的 lambda 应映射到 CallbackFunctionB
  • Callback 类的实例或从中派生的类应映射到自身

你实际拥有的:

  • 只有一个 operator() 且不返回任何内容且有一个 const A& 类型参数的仿函数将映射到 CallbackFunctionA
  • 只有一个 operator() 且不返回任何内容且有一个 const B& 类型参数的仿函数将映射到 CallbackFunctionB
  • 任何其他东西都会被映射到它自己

我的建议:像这样定义一个简单的转发器,以便在可能的时候调用:

template<class X, class ARG...>
static auto may_invoke(const X& x, ARG&&... arg)
-> decltype(x(std::forward<ARG>(arg)...))
{ return x(std::forward<ARG>(arg)...); }
struct not_invoked {};
template<class X>
constexpr static not_invoked may_invoke(const X&, ...)
{ return {}; }

此外,是否可以调用测试器是很好的:

template<class X, class ARG...>
constexpr bool does_invoke(const X& x, ARG&&... arg)
{ return !std::is_same<not_invoked,
decltype(may_invoke(x, std::forward<ARG>(arg)...))>::value; }

这允许您同时使代码更通用,测试更严格。

关于c++ - 根据 lambda 签名选择类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25260688/

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