3
我想编写一个测试从基类继承的concept
。在Concept中使用带CRTP的模板模板参数
我的Base
类是由Derived
类使用CRTP公开继承的。
此代码工作正常:
#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;
}
...
明显的问题是,我有我的concept
声明没有T
。 此外,我敢肯定,我不能宣布
template<template <typename> class D, typename T>
concept bool inheritsFromB() {
...
}
因为
concept
需要一个模板参数。
编辑 - 在第8.3.5节,P23,template<typename T, typename U> concept bool C3 = true;
的Working Paper P0121R0名单。因此,无论我在哪里阅读concept
只能使用一个参数,都是过时的,错误的,或者我认为它不够用。 结束编辑
我可以访问我需要的其他类型T
吗?有没有其他的方法(在我看来,像模板类型D
将携带它是什么类型的信息是T
是,但我也不能使用using T = typename D<T>::valueType;
,因为我需要T
具体的类型D<T>
...)
看起来不错 - 我嵌套在'detail'命名空间中'NS'然后移动'使用is_derived_from_base'声明进入'NS'也,这样我的con cept现在使用'NS :: is_derived_from_base'。感谢你的回答! – chrisb2244