我想写一个concept
测试从基类继承的东西。
我的类使用 CRTPBase
由类公开继承。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() {
...
}
因为 a concept
需要一个模板参数。
编辑-工作文件 P0121R0在第 8.3.5 节第23 页中列出,template<typename T, typename U> concept bool C3 = true;
. 因此,无论我在哪里阅读 a concept
can take only 一个参数,要么是过时的、错误的,要么是我阅读时不小心。结束编辑
我可以在这里访问T
我需要的其他类型吗?有没有另一种方法(在我看来,模板类型D
会携带它的类型的信息T
,但我也不能使用using T = typename D<T>::valueType;
,因为我需要T
具体的类型D<T>
......)