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;
T
D<T>