条件模板变量

Conditional template variable

本文关键字:变量 条件      更新时间:2023-10-16
#include <type_traits>
template< typename T >
using cond =
    std::conditional_t<
        std::is_void< T >::value ,
        std::true_type ,
        std::false_type
    >::value;
static_assert( cond< void > , "" );
int main() {}

示例 clang 3.6

missing 'typename' prior to dependent type name 'std::conditional_t::value, std::true_type, std::false_type>::value'

为什么它缺少typename,因为它根本不是一种类型?
如果我添加typename它会向我抛出这个:

error: typename specifier refers to non-type member 'value' in 'std::integral_constant<bool, true>'

不是和这里一样吗?我该如何解决此问题?

只能使用模板别名来别名类型。变量模板的正确语法是

template< typename T >
constexpr bool cond = std::conditional_t< std::is_void< T >::value,
                      std::true_type,
                      std::false_type >::value;

虽然您的代码收到的错误消息有点令人困惑,但添加建议的typename会导致 clang 3.6 的这条更有用的消息

error: typename specifier refers to non-type member 'value' in
       'std::integral_constant'
using cond = typename std::conditional_t< std::is_void< T >::value,
^~~~~                 std::true_type,
                      std::false_type >::value;

这解释了真正的问题。