【发布时间】:2014-08-12 09:24:49
【问题描述】:
我正在尝试根据 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 派生的包装类(CallbackFunctionA 或 CallbackFunctionB),否则应返回对回调类型本身的引用。
正如我所说,上面的代码工作得很好,但我想知道它是否可以简化,即通过消除对 testany 和 testlambda 函数的需要。
【问题讨论】:
-
为什么
std::function不适合你?另外,您知道通用 lambda 表达式吗? -
@Deduplicator std::function 不起作用,因为我需要添加 lambda 未定义的占位符运算符。当 lambda 匹配时,包装器调用指定的 lambda 而不是占位符。有关详细信息,请参阅 ideone 上的示例。我不知道通用 lambda,谢谢。这可能是未来定义一个可以同时接受
A或B的回调的替代方案。
标签: c++ templates c++11 lambda template-meta-programming