std :: void_t和嵌套的非类型成员

时间:2018-08-28 21:34:37

标签: c++ templates c++17 template-meta-programming sfinae

我在以下代码中得到了意外的结果(第二个static_assert失败了):

#include <type_traits>

template <typename T, typename = void>
struct is_bananas : std::false_type {};
template <typename T>
struct is_bananas<T, std::void_t<typename T::config::num_items>>
    : std::true_type {};

struct Config{
    static constexpr int num_items=42;
};

struct Bananas{
    using config = Config;
};

static_assert(is_bananas<int>::value == false);
static_assert(is_bananas<Bananas>::value == true);

当我使用T::config而不是T::config::num_items时,代码将按预期工作。

如果我在decltype周围使用num_items,那么它将起作用。

我是否正确地假设void_t仅适用于类型?

是否有更好的方法来做我想做的事?
如果有人对此感到困惑(并认为:仅仅抛出decltype)-我发现decltype在长名称和深层嵌套的情况下很难用真实的代码阅读,因此,如果有更好的方法void_t或我想知道的任何其他模板代码。

1 个答案:

答案 0 :(得分:4)

  

是否有更好的方法来做我想做的事?

比较好主观。

通过示例,我发现您的getComputedStyles解决方案非常好。

无论如何...可能的替代方法是定义decltype()的替代值,该替代方法可用于值类型

类似

std::void_t

然后写

template <auto...>
using value_void_t = void;