带非类型参数的成员函数的部分专门化

Partial specialisation of member function with non-type parameter

本文关键字:专门化 函数 成员 类型参数      更新时间:2023-10-16

我有一个模板类,它既有类型模板参数,也有非类型模板参数。我想专门化一个成员函数,我发现,如下面的例子所示,我可以做一个完全的专门化。

template<typename T, int R>
struct foo
{
    foo(const T& v) :
        value_(v)
    {}
    void bar()
    {
        std::cout << "Generic" << std::endl;
        for (int i = 0; i < R; ++i)
            std::cout << value_ << std::endl;
    }
    T value_;
};
template<>
void foo<float, 3>::bar()
{
    std::cout << "Float" << std::endl;
    for (int i = 0; i < 3; ++i)
        std::cout << value_ << std::endl;
}

但是这个局部专门化不能编译。

template<int R>
void foo<double, R>::bar()
{
    std::cout << "Double" << std::endl;
    for (int i = 0; i < R; ++i)
        std::cout << value_ << std::endl;
}

有没有一种方法可以实现我正在尝试的东西,有人会知道吗?

可以将函数封装在类中。

只能部分特化类,不能部分特化函数。

template<typename T, int R>
struct foo
{
    foo(const T& v) :
        value_(v)
    {}
    void bar()
    {
        return bar_impl< T, R >::bar( * this );
    }
    friend struct bar_impl< T, R >;
    T value_;
};
template< typename T, int R >
struct bar_impl {
    static void bar( foo< T, R > &t ) {
        std::cout << "Generic" << std::endl;
        for (int i = 0; i < R; ++i)
            std::cout << t.value_ << std::endl;
    }
};
template<>
struct bar_impl<float, 3> {
static void bar( foo< float, 3 > &t ) {
    std::cout << "Float" << std::endl;
    for (int i = 0; i < 3; ++i)
        std::cout << t.value_ << std::endl;
}
};
template<int R>
struct bar_impl<double, R> {
static void bar( foo< double, R > &t ) {
    std::cout << "Double" << std::endl;
    for (int i = 0; i < R; ++i)
        std::cout << t.value_ << std::endl;
}
};

局部专门化只适用于整个类,而不适用于成员函数。所以你需要

template<int R>
struct foo<double, R>
{
    foo(const double& v) :
        value_(v)
    {}
    void bar()
    {    
       std::cout << "Double" << std::endl;
       for (int i = 0; i < R; ++i)
          std::cout << value_ << std::endl;
    }
    double value_;
};