3

concept基本クラスからの継承をテストする を書きたいと思います。

私のクラスは、CRTP を使用して、クラスBaseによってパブリックに継承されます。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宣言に no がないことです。さらに、私は宣言できないと確信しています

template<template <typename> class D, typename T> 
concept bool inheritsFromB() {
... 
}

conceptにはテンプレート パラメータが 1 つ必要なためです。

編集-セクション 8.3.5、p23ワーキング ペーパー P0121R0リスト。その結果、私が読むところはどこでも、1つのパラメーターしか取ることができず、時代遅れであるか、間違っているか、または注意を怠って読んでいました。編集を終了template<typename T, typename U> concept bool C3 = true;concept

Tここで必要な他のタイプにアクセスできますか? 別の方法はありますか(テンプレートDのタイプがそのタイプの情報を運ぶように思えますが、タイプを特定する必要があるため、T使用することもできません...)using T = typename D<T>::valueType;TD<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 に答える