Частичная специализация функции-члена с нетиповым параметром - PullRequest
10 голосов
/ 16 апреля 2011

У меня есть шаблонный класс с типом и нетиповым параметром шаблона. Я хочу специализировать функцию-член, и я обнаружил, что, как в примере ниже, я могу выполнить полную специализацию.

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.

Ответы [ 2 ]

12 голосов
/ 16 апреля 2011

Вы можете обернуть функцию внутри класса.

Только классы, но не функции, могут быть частично специализированными.

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;
}
};
1 голос
/ 16 апреля 2011

Частичная специализация возможна только для полного класса, но не для функции-члена. Так что вам нужно

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_;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...