使用模板模板参数与概念中的CRTP
Use a template template parameter with CRTP in a Concept
我想写一个测试基类继承的concept
。
我的Base
类使用CRTP被Derived
类公开继承。
下面的代码运行正常:
#include <type_traits>
namespace NS
{
template<typename D>
class Base {
// ...
};
class Derived : public Base<Derived>
{
public:
constexpr Derived() = default;
// ...
};
}
template<typename D>
concept bool inheritsFromB() {
return std::is_base_of<NS::Base<D>, D>::value;
}
template<inheritsFromB b>
void myFunct() {};
int main() {
constexpr auto d = NS::Derived();
using dType = typename std::decay<decltype(d)>::type;
myFunct<dType>();
}
如果我想模板Derived
,我遇到了一个问题。这可能吗?
namespace NS
{
template<typename D, typename T>
class Base { ... };
template<typename T>
class Derived : public Base<Derived<T>, T>
{ // ...
// probably some using declaration for T?
};
}
template<template <typename> class D>
concept bool inheritsFromB() {
return std::is_base_of<NS::B<D<T>,T>, D<T>::value;
}
...
明显的问题是,我没有T
在我的concept
声明。而且,我很确定我不能声明
template<template <typename> class D, typename T>
concept bool inheritsFromB() {
...
}
,因为concept
需要一个模板参数。
编辑 -工作文件P0121R0列表在 8.3.5节,p23, template<typename T, typename U> concept bool C3 = true;
。因此,无论我在哪里读到concept
只能取一个参数,要么是过时的,要么是错误的,要么是我读得不够仔细。结束编辑
我可以访问我在这里需要的其他类型T
吗?是否有另一种方法(在我看来,模板类型D
将携带它的类型T
的信息,但我也不能使用using T = typename D<T>::valueType;
,因为我需要T
来指定D<T>
的类型…)
我怀疑以下特征应该起作用:
#include <type_traits>
#include <utility>
namespace NS
{
template <typename D, typename T>
class Base {};
template <typename T>
class Derived : public Base<Derived<T>, T> {};
}
namespace detail
{
template <typename T, template <typename> typename D>
std::true_type is_derived_from_base(const ::NS::Base<D<T>,T>*);
std::false_type is_derived_from_base(void*);
}
template <typename T>
using is_derived_from_base = decltype(detail::is_derived_from_base(std::declval<T*>()));
template <typename T>
concept bool inheritsFromB()
{
return is_derived_from_base<T>{};
}
DEMO(不含概念)
相关文章:
- 如何反转整数参数包
- 为什么 CRTP 模板C++给出无效参数错误?
- 如何使用 CRTP 创建具有基类的可选模板参数
- 有没有一种干净(更)的方法将 CRTP 与可变参数继承混合在一起?
- 用static_cast(*this)...初始化可变参数CRTP:<Base>合法吗?
- 使用派生的模板参数类型作为函数 (CRTP) 的返回类型
- CRTP:具有基于派生参数的函数
- 如何将模板参数传递给CRTP
- 奇怪的重复模板模式(CRTP)和派生的构造函数参数
- Boost.Parameter:与 CRTP 组合的命名模板参数
- 如何使参数化的基础成为 CRTP 中派生的朋友
- 具有模板模板参数的CRTP
- 可以使用CRTP和以接口为参数的函数吗
- 在CRTP中使用模板参数的嵌套类
- clang++在使用CRTP时不接受使用模板模板参数
- CRTP+可变模板+提取CRTP子类参数
- 使用模板模板参数与概念中的CRTP
- 如何在使用CRTP时获取模板参数的大小
- 带有参数化基类的c++ CRTP
- 使用奇怪循环模板模式(CRTP)和其他类型参数