Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > A<T,S> и A<T,T>


Автор: d06osipov 12.9.2007, 18:23
У меня есть обширный класс 
Код

template<class T,class S>
class A
{
...
};


Я хочу определить класс

Код

template<class T>
class A<T,T>
{
...
};


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

Автор: JackYF 12.9.2007, 20:03
Цитата(d06osipov @  12.9.2007,  18:23 Найти цитируемый пост)
или есть способ цивилизованней?

есть. Определяй базовый класс, который будет содержать всё, кроме этой заданной процедуры, унаследуй оба класса (точнее варианта шаблона класса) от него и в каждом дореализуй эту разную функцию.


Автор: UnrealMan 13.9.2007, 21:52
Можно воспользоваться перегрузкой

Код

#include <iostream>
#include <ostream>

template <class T1, class T2>
    struct IsEqualTypes
        { static const bool value = false; };
template <class T>
    struct IsEqualTypes<T, T>
        { static const bool value = true; };

template <int>
    struct IntToType {};

template <bool b, class T>
    struct EnableIf { typedef T Type; };
template <class T>
    struct EnableIf<false, T> {};

template <class T, class S>
    class A
{
public:
    void f() const
        { f_impl(IntToType<IsEqualTypes<T, S>::value>()); }

private:
    void f_impl(IntToType<0>) const // T isn't equal to S
        { std::cout << "A<T, S>::f()" << std::endl; }
    void f_impl(IntToType<1>) const // T is equal to S
        { std::cout << "A<T, T>::f()" << std::endl; }
};


int main()
{
    A<int, char>().f();
    A<int, int>().f();
}

Автор: JackYF 13.9.2007, 22:30
Цитата(UnrealMan @  13.9.2007,  21:52 Найти цитируемый пост)
Можно

можно. Но, имхо, здесь это из пушки по слонам.

Автор: UnrealMan 14.9.2007, 12:06
Цитата(UnrealMan @  13.9.2007,  22:52 Найти цитируемый пост)
Можно воспользоваться перегрузкой

Хотя я бы поступил примерно так:

Код

#include <iostream>
#include <ostream>

template <class T, class S>
    class A
{
public:
    A(int n) : n(n) {}
    void f() const;
private:
    int n;
    template <class T_, class S_>
        friend class AHelper;
};

template <class T, class S>
    struct AHelper
{
    static void f(const A<T, S> &a) { std::cout << "A<T, S>::f(); n = " << a.n << std::endl; }
};

template <class T>
    struct AHelper<T, T>
{
    static void f(const A<T, T> &a) { std::cout << "A<T, T>::f(); n = " << a.n << std::endl; }
};

template <class T, class S>
    void A<T, S>::f() const
        { AHelper<T, S>::f(*this); }

int main()
{
    A<int, char>(1).f();
    A<int, int>(2).f();
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)