c++ - 具有非类型参数的成员函数的部分特化

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

我有一个带有类型和非类型模板参数的模板类。我想特化一个成员函数,我发现,如下例所示,我可以进行完全特化。

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

关于c++ - 具有非类型参数的成员函数的部分特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5688355/

相关文章:

c++ - 使用子类中的类型定义扩展模板类

c++ - 在 C++ 中从类模板定义函数

c++ - 如果 compile-time-constant 参数错误,则生成编译时错误

c++ - 具有通用功能的专用模板类

c++ - 如何使用 GCC 编译指示启用选项 '-Werror'?

c++ 为什么 const& 可以得到 const 值?

c++ - 有没有一种方法可以在编译时断言变量是 C++ 中的类、结构还是基本类型?

c++ - 尽管有 static_assert,但默认模板匹配

c++ - 类模板特化可以利用非特化实现吗?

c++ - 当 A 和 B 没有共同的祖先时,通过 dynamic_cast 从 A* 转换为 B* 是否有效?