考虑以下基于以下的基本示例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 {};
Run Code Online (Sandbox Code Playgroud)
它可以如下使用:
template<typename T>
std::enable_if_t<S<T>::value> func() { }
Run Code Online (Sandbox Code Playgroud)
使用尾随返回类型可以完成相同的操作decltype:
template<typename T>
auto func() -> decltype(std::declval<T>().foo(), void()) { }
Run Code Online (Sandbox Code Playgroud)
对于我想到的所有例子都是如此.我找不到一个案例,其中任何一个void_t或尾随返回类型decltype可以使用,而其对应的不能.
最复杂的情况可以通过尾随返回类型和重载的组合来解决(例如,当检测器用于在两个函数之间切换而不是作为禁用或启用某些东西的触发器时).
是这样的吗?他们是(void_t和decltype作为后返回类型以及如果需要重载)完全互换?
否则,是什么情况下,一个人不能用来解决约束,我被迫使用一个特定的方法?