【问题标题】:Conditional template variable条件模板变量
【发布时间】:2015-05-25 16:26:34
【问题描述】:
#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() {}

Example 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>'

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

【问题讨论】:

  • using, in that form,需要一个类型名。不是一个值。
  • conditional_ttrue_typefalse_type一起使用有什么意义,如果可以直接使用std::is_void&lt; T &gt;::value
  • Ahhh .. 我挣扎了一个多小时,然后我意识到大多数在线编译器使用 g++
  • @PiotrS。这只是一个例子,条件可以是任何东西(我脑子里有模板)

标签: c++ c++14


【解决方案1】:

您只能将template aliases 用于别名类型。变量模板的正确语法是

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;

这解释了真正的问题。

【讨论】:

  • 谢谢,当我看到你和其他(已删除)的答案时,我立即意识到
  • 为什么不template&lt; typename T &gt; constexpr bool cond = std::is_void&lt; T &gt;::value???
  • @Orient 因为我一直忠实于问题中的其余代码 :)
猜你喜欢
  • 2018-02-06
  • 2023-04-03
  • 1970-01-01
  • 2017-09-25
  • 2019-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多