我想为 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/