【发布时间】:2017-01-25 21:38:37
【问题描述】:
考虑以下基于void_t 的基本示例:
template<typename, typename = void_t<>>
struct S: std::false_type {};
template<typename T>
struct S<T, void_t<decltype(std::declval<T>().foo())>>: std::true_type {};
可以这样使用:
template<typename T>
std::enable_if_t<S<T>::value> func() { }
同样可以使用尾随返回类型和decltype:
template<typename T>
auto func() -> decltype(std::declval<T>().foo(), void()) { }
我想到的所有例子都是如此。我在找到一个void_t或尾随返回类型的情况下无法使用decltype,而在其对方不能。
最复杂的情况可以通过尾随返回类型和重载的组合来解决(例如,当 检测器 用于在两个函数之间切换而不是作为触发来禁用或启用某些东西)。
是这样吗?它们(void_t 和 decltype 作为尾随返回类型加上重载,如果需要)完全可以互换吗?
否则,在什么情况下无法使用它来解决约束而我不得不使用特定的方法?
【问题讨论】:
-
第一行的
typename = void_t<>可以是typename = void,imo比较清楚一点。 -
This 可能会引起您的兴趣
-
@W.F.它使用
decltype代替void_t作为特化的模板参数。我问的是稍微不同的东西。还是谢谢你。 -
@skypjack 我没有说这是重复的,我只是说它可能会引起你的兴趣:)
-
Yakk 的
can_apply在阅读您的问题时立即浮现在脑海
标签: c++ templates sfinae decltype c++17