在C++中,如何创建从模板基类派生的专用化方法

ht4b089n  于 2022-11-27  发布在  其他
关注(0)|答案(2)|浏览(159)

我有一个模板基类,它有一个模板方法Foo和一个定义枚举类的概念。我想创建一个派生类,它将为特定的枚举类值创建方法Foo的专门化,如下所示:
第一个
但是,如果声明'void Deriving::Foo()'的模板ID 'Foo〈A::a,B::b〉与任何模板声明都不匹配,则以下语句将无法编译。是否可以修改它以使其工作?

2q5ifsrm

2q5ifsrm1#

为什么不这样做呢?

#include <type_traits>

//template<typename T>
//concept EnumClass = is_scoped_enum<T>::value; // implementation as seen https://en.cppreference.com/w/cpp/types/is_scoped_enum 

template<typename T>
concept EnumClass = std::is_enum_v<T>; // for testing locally

enum class A { a };
enum class B { b };

template <EnumClass ECA, EnumClass ECB>
class Bar
{
public:
    template<ECA ECAval, ECB ECBval>
    void Foo() {}
};

class Deriving : 
    public Bar<A, B>
{
public:
    void Foo() 
    {
        // you can reuse "base implementation" here if needed
        Bar<A, B>::Foo<A::a, B::b>();
        /* impl... */ 
    }
};

int main()
{
}
6vl6ewon

6vl6ewon2#

我建议使用标记调度来重载,而不是专门化:

template <EnumClass ECA, EnumClass ECB, ECA ECAval, ECB ECBval>
void FooImpl(std::integral_constant<ECA, ECAval>,
             std::integral_constant<ECB, ECBval>)
{
    // generic implementation
}

template <EnumClass ECA, EnumClass ECB>
class Bar
{
    template<ECA ECAval, ECB ECBval>
    void Foo()
    {
       FooImpl(std::integral_constant<ECA, ECAval>{},
               std::integral_constant<ECB, ECBval>{});
    }
};

enum class A{a};
enum class B{b};

FooImpl(std::integral_constant<A, A::a>, std::integral_constant<B, B::b>)
{
    // Your specialization
}

不使用Derived ...

相关问题