Различная реализация шаблонного метода класса для определенного типа шаблона класса - PullRequest
4 голосов
/ 15 ноября 2009

У меня есть шаблонный класс с методом, для которого мне нужна другая реализация для определенного типа шаблона. Как мне это сделать?

Ответы [ 3 ]

4 голосов
/ 15 ноября 2009

Вам нужно будет создать частичную (или полную) специализацию для этого конкретного типа.

3 голосов
/ 15 ноября 2009

Вы можете специализировать метод для этого типа. Э.Г.

template<typename T>
struct TemplatedClass
{
    std::string methodA () {return "T methodA";}

    std::string methodB () {return "T methodB";}
    std::string methodC () {return "T methodC";}
};

// Specialise methodA for int.

template<>
std::string TemplatedClass<int>::methodA ()
{
    return "int methodA";
}
2 голосов
/ 15 ноября 2009

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

Если вы хотите специализировать определенный метод в классе, не создавая заново все остальное, это немного сложнее. Вы можете сделать это, передав в качестве аргумента шаблонную структуру с нулевым размером, например:

template<typename T> struct TypeHolder { };

template<typename T> class TemplateBase {
public:
    void methodInterface() {
        methodImplementation(TypeHolder<T>);
    }
    void anotherMethod() {
        // implementation for a function that does not
        // need to be specialized
    }
private:
    void methodImplementation(TypeHolder<int>) {
        // implementation for int type
    }
    void methodImplementation(TypeHolder<float>) {
        // implementation for float type
    }
};

Компилятор вставит соответствующий methodImplementation в methodInterface, а также исключит структуру с нулевым размером, так что все будет так, как если бы вы сделали специализацию только для функции-члена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...