クラスがテンプレートの特殊化であるかどうかを確認しますか?、クラスがテンプレートの特殊化であるかどうかを確認できます。
を使用してstd::is_convertible<A*, B*>
、AがBの子クラスであるかどうかを確認できます。
どのように私は実装することができis_convertible_specialization
、どうなる何かを:
template<typename ... Args>
class Base {};
template<typename ... Args>
class Child : public Base<Args...> {};
template<typename ... Args>
class Unrelated{};
static_assert( is_convertible_specialization<Child<int, int>, Base>{} ); // True
static_assert( is_convertible_specialization<Unrelated<int, int>, Base>{} ); // False
すでにいくつか試しましたが、TMPのスキルがかなり不足しているので、近づいていないと思います。私の「最善の」試みは次のとおりです。
template<template<class...> class ChildTemplate, template<class...> class Template, class... Args>
struct is_convertible_specialization : std::false_type {};
template<template<class...> class ChildTemplate, template<class...> class Template, class... Args>
struct is_convertible_specialization<ChildTemplate<Args...>, Template> : std::true_type {
is_convertible_specialization() {
static_assert( std::is_convertible<ChildTemplate<Args...> *, Template<Args...> *>());
}
};
ここでは、私には単純に思える方法でアサーションを「ネスト」しようとします。これにより、次のエラーメッセージが表示されます。これは漠然と理解できるように見えますが、私にはあまり理解できません。
Template argument for template template parameter must be a class template or type alias template
あなたは近かった。
まず、プライマリテンプレートのテンプレートパラメータ(特殊化ではない)は、テンプレートの使用方法と一致している必要があります。
template <typename ChildTemplate, template<class...> class Template>
次に、ポインタが変換可能でない場合、の特殊化is_convertible_specialization
はfalse
静的アサーションをトリガーする代わりに評価する必要があります。これを行うstd::is_convertible_v<...>
にはstd::true_type
、の代わりにから継承し、カスタムコンストラクターを削除します。
結果は次のとおりです。
template <typename ChildTemplate, template<class...> class Template>
struct is_convertible_specialization : std::false_type {};
template <template<class...> class ChildTemplate, template<class...> class Template, class... Args>
struct is_convertible_specialization<ChildTemplate<Args...>, Template>
: std::is_convertible<ChildTemplate<Args...> *, Template<Args...> *>
{};
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加