【发布时间】:2017-03-10 09:25:23
【问题描述】:
我一直在尝试通过阅读以下文章Link 来了解 SFINAE 技巧,但在理解其中的某些部分时遇到了困难。
完整代码:Link
我主要对这些代码行感到困惑。
// Check if a type has a serialize method.
auto hasSerialize = is_valid([](auto&& x)
-> decltype(x.serialize()) { });
template <class T> auto serialize(T& obj)
-> typename std::enable_if<decltype(hasSerialize(obj))::value, std::string>::type
{
return obj.serialize();
}
template <class T> auto serialize(T& obj)
-> typename std::enable_if<!decltype(hasSerialize(obj))::value, std::string>::type
{
return to_string(obj);
}
尤其是 hasSerialize 行,它在 decltype 中使用参数。谁能告诉我这里发生了什么? hasSerialize 是一种方法吗? hasSerialize 右侧的表达式(lambda)实际上将计算为什么?评估中的执行顺序是什么?在 hasSeriaize 中 auto 的结果是什么?
请帮助我理解这一点,因为我为此苦苦挣扎了一周,但仍然无法理解。如果有人能给出一个实际的例子,将不胜感激。
谢谢
【问题讨论】:
标签: c++ templates lambda sfinae auto