c++ - 编写自定义 c++14 风格的类型别名

标签 c++ templates alias c++14

我想为 std::is_base_of 创建一个 _t 别名,类似于 std::enable_if_t 的别名>std::enable_if。所以我将以下内容添加到我的标准标题中:

namespace std {
  template<typename T, typename U>
  using is_base_of_t = typename is_base_of<T,U>::type;
}

我在以下上下文中使用这个新别名:

template <typename SpaceT,
          typename TagT,
          typename = std::enable_if_t<std::is_base_of_t<Space,SpaceT>>>
class SpatialTree : public SpaceT {
};

我收到以下 gcc 错误:

SpatialTree.h:48:101: error: type/value mismatch at argument 1 in template parameter list for ‘template<bool _Cond, class _Tp> using enable_if_t = typename std::enable_if::type’
 template <typename SpaceT, typename TagT, typename = std::enable_if_t<std::is_base_of_t<Space,SpaceT>>>

我做错了什么?

最佳答案

std::enable_if 定义如下:

template< bool B, class T = void >
struct enable_if;

第一个参数是一个,而不是一个类型。你需要传入std::is_base_of<Space,SpaceT>::value作为第一个参数。对于 C++14,正确的别名应该是一个变量模板:

template <class Base, class Derived>
constexpr bool is_base_of_v = std::is_base_of<Base, Derived>::value;

你会用同样的方式:

template <typename SpaceT, typename TagT,
          typename = std::enable_if_t<is_base_of_v<Space,SpaceT>>>
                                                ^^^
class SpatialTree : public SpaceT {
};

后者目前存在于 <experimental/type_traits> .

关于c++ - 编写自定义 c++14 风格的类型别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32746784/

相关文章:

c++ - C++ 流中的eof()、fail()、bad() 和good() 之间有什么区别?

wpf - 在 WPF 中的不同控件上显示验证错误模板

c++ - 具有模板类型的模板化模板参数列表

mysql - Django ORM 中的别名

c++ - 在 C++ 11 中将指针传递给临时变量?

c++ - 为什么 p &key3 + 2 和 p (int*)&key3 + 2 在 LLVM 中会打印不同的结果?

ruby-on-rails - 你能覆盖 Ruby 中的别名方法吗?

Git 无法识别别名

c++ - Vim 在 C++ 类中的格式化/自动缩进似乎不正确。这是正常的吗?

html - 更改没有 body.background 的自定义博主模板中的背景