3

我想写一个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() {
... 
}

因为 aconcept需要一个模板参数。

编辑-工作文件 P0121R0第 8.3.5 节第23 页中列出,template<typename T, typename U> concept bool C3 = true;. 因此,无论我在哪里阅读 a conceptcan take only 一个参数,要么是过时的、错误的,要么是我阅读时不小心。结束编辑

我可以在这里访问T我需要的其他类型吗?有没有另一种方法(在我看来,模板类型D会携带它的类型的信息T,但我也不能使用using T = typename D<T>::valueType;,因为我需要T具体的类型D<T>......)

4

1 回答 1

2

我怀疑以下特征应该起作用:

#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>{};
}

演示(没有概念)

于 2015-10-21T06:38:49.933 回答