【问题标题】:Partial specialisation of member function with non-type parameter非类型参数成员函数的部分特化
【发布时间】:2022-01-11 05:50:53
【问题描述】:

我有一个包含类型和非类型模板参数的模板类。我想专门化一个成员函数,我发现,如下例所示,我可以做一个完整的专门化。

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 中尝试过。

【问题讨论】:

    标签: c++ templates template-specialization partial-specialization


    【解决方案1】:

    部分特化仅适用于整个类,而不是成员函数。所以你需要

    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_;
    };
    

    【讨论】:

    • 感谢 AProgrammer,没有意识到成员函数根本不可能进行部分特化。
    【解决方案2】:

    您可以将函数包装在一个类中。

    只有类,而不是函数,可以部分特化。

    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;
    }
    };
    

    【讨论】:

    • 我很高兴 C++0x 取消了这一点。 :)
    • @Xeo: 不是 :v( 。我忘记了细节,但是函数重载解析和类专业化解析机制是相同的,两个稍微不同的用例没有' t 结合干净。
    • 这一切的结果是函数参数没有类型推导。
    • 谢谢 Potatoswatter,我现在应该可以达到我的目标了!
    猜你喜欢
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多