具有非类型参数的成员函数的部分专业化

| 我有一个同时具有类型和非类型模板参数的模板类。我想对成员函数进行专业化处理,我发现,如下面的示例所示,我可以进行完全的专业化处理。
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;
}
有没有办法可以实现我正在尝试的任何人呢?我在MSVC 2010中尝试过此操作。     
已邀请:
您可以将函数包装在类中。 只有类而不是函数可能会部分地专门化。
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_;
};
    

要回复问题请先登录注册