【问题标题】:std::enable_if ... else aka typename_if_elsestd::enable_if ... else aka typename_if_else
【发布时间】:2021-03-07 08:19:01
【问题描述】:

类似于std::enable_if 我想要一个else 类型信息(我需要这个用于依赖可变参数模板static_cast)。我从standard 扩展了可能的实现,如下所示:

template<bool B, class T = void, class F = void>
struct typename_if_else
{};

template<class T, class F>
struct typename_if_else<true, T, F>
{
    typedef T type;
};

template<class T, class F>
struct typename_if_else<false, T, F>
{
    typedef F type;
};

template< bool B, class T = void >
using typename_if_else_t = typename typename_if_else<B,T>::type;

有没有办法摆脱不再需要的空结构(第一个定义)?

【问题讨论】:

标签: c++ templates typetraits enable-if


【解决方案1】:

您可以为false 创建部分模板特化,并让true 成为默认值。

template<bool B, class T = void, class F = void>
struct typename_if_else
{
typedef T type;
};

template<class T, class F>
struct typename_if_else<false, T, F>
{
    typedef F type;
};

template< bool B, class T = void >
using typename_if_else_t = typename typename_if_else<B,T>::type;

【讨论】:

  • 这是部分特化,不是覆盖
【解决方案2】:

有没有办法摆脱不再需要的空结构(第一个定义)?

是的,感谢std::conditional,您甚至可以摆脱部分专业化:

#include <type_traits>

template<bool B, class T = void, class F = void>
using typename_if_else = std::conditional_t<B, T, F>; // (can be omitted if you only care for typename_if_else_t)

template<bool B, class T = void>
using typename_if_else_t = typename typename_if_else<B,T>::type;

【讨论】:

  • 为什么不直接推荐使用std::conditional_t
  • 我不是说在执行typename_if_else;我的意思是为什么不完全替换typename_if_else?它只是为标准库中已经存在的功能添加了另一层不必要的间接(甚至使用标准库来实现这种间接)
  • @dfrib pfff 这就是我在电话中回答 SO 问题时得到的结果......谢谢。
  • 这确实是我想要的!应该推荐See also of std::enable_if...
猜你喜欢
  • 2012-10-26
  • 2014-08-29
  • 2013-06-03
  • 2016-02-25
  • 2017-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多