шаблон как параметр шаблона при специализации
От: uaf  
Дата: 08.07.10 12:27
Оценка:
Всем доброго времени суток.
Сломал голову пытясь параметризировать специализировать метод Rec::set (приведен упрощенный пример):

#include <iostream>

class Rec
{
public:
    Rec() {};
    template <class T> void set(const T& rVal) {std::cout << "default";}
};

template <class Obj>
class Ett {};

// таких классов будет много
class Obj1 {};
class Obj2 {};


template <>
void Rec::set(const Ett<Obj1>& rVal) {std::cout << "Obj1";}

template <> 
void Rec::set(const Ett<Obj2>& rVal) {std::cout << "Obj2";}

int main(int argc, char* argv[])
{
    Rec rec;

    Ett<Obj1> eo1;
    Ett<Obj2> eo2;

    rec.set(eo1);
    rec.set(eo2);
    return 0;
}


Хочется одним махом специализировать set для всех шаблонных класов Ett, что-то вроде:

template <template <class> class E>
void Rec::set(const Ett<E>& rVal) {std::cout << "Obj";} // не проходит (


Если кто силен в этом — подскажите, пожалуйста.
Спасибо.
Re: шаблон как параметр шаблона при специализации
От: Viper_Craft  
Дата: 08.07.10 12:32
Оценка:
Здравствуйте, uaf, Вы писали:

uaf>Всем доброго времени суток.

uaf>Сломал голову пытясь параметризировать специализировать метод Rec::set (приведен упрощенный пример):
uaf>
uaf>template <template <class> class E>
uaf>void Rec::set(const Ett<E>& rVal) {std::cout << "Obj";} // не проходит (
uaf>


uaf>Если кто силен в этом — подскажите, пожалуйста.

uaf>Спасибо.

меняй компайлер, на нормальных(тестил на gcc 4.4) все работает...
Re[2]: шаблон как параметр шаблона при специализации
От: uaf  
Дата: 08.07.10 12:39
Оценка:
Здравствуйте, Viper_Craft, Вы писали:

V_C>меняй компайлер, на нормальных(тестил на gcc 4.4) все работает...


ооо! спасибо, здорово! по крайней мере думал правильно, но gcc — не решение )
нужно заставить работать на VS2010.
Re[2]: шаблон как параметр шаблона при специализации
От: посетитель /life/  
Дата: 08.07.10 12:42
Оценка:
Здравствуйте, Viper_Craft, Вы писали:

V_C>меняй компайлер, на нормальных(тестил на gcc 4.4) все работает...


Можно работающий код в студию?
Re: шаблон как параметр шаблона при специализации
От: uzhas Ниоткуда  
Дата: 08.07.10 12:43
Оценка:
Здравствуйте, uaf, Вы писали:

uaf>Всем доброго времени суток.

uaf>Сломал голову пытясь параметризировать специализировать метод Rec::set (приведен упрощенный пример):

uaf>Хочется одним махом специализировать set для всех шаблонных класов Ett, что-то вроде:


uaf>
uaf>template <template <class> class E>
uaf>void Rec::set(const Ett<E>& rVal) {std::cout << "Obj";} // не проходит (
uaf>


вы, наверное, хотели написать так:
template <class E>
void Rec::set(const Ett<E>& rVal) {std::cout << "Obj";}


частичной специализации для функций нет. только для классов
вы можете сделать свой класс шаблонным
если нужны выкрутасы с шаблонами, то скоро их вам здесь напишут профессионалы
Re: шаблон как параметр шаблона при специализации
От: посетитель /life/  
Дата: 08.07.10 12:45
Оценка: 1 (1)
Здравствуйте, uaf, Вы писали:

uaf>Хочется одним махом специализировать set для всех шаблонных класов Ett, что-то вроде:


Насколько я понял, тебе нужна частичная специализация функций-шаблонов. В С++ ее нет.
Можно в класс Rec добавить перегруженный метод, если это допустимо
class Rec
{
public:
    Rec() {};
    template <class T> 
    void set(const T& rVal) {std::cout << "default";}

    template <class T> 
    void set(const Ett<T>& rVal) {std::cout << "Obj";}
};
Re[2]: шаблон как параметр шаблона при специализации
От: uaf  
Дата: 08.07.10 12:49
Оценка:
Здравствуйте, uzhas, Вы писали:

U>вы, наверное, хотели написать так:

U>
U>template <class E>
U>void Rec::set(const Ett<E>& rVal) {std::cout << "Obj";}
U>

так в первую очередь пробовал )

U>частичной специализации для функций нет. только для классов

это не есть частичная специализация, ИМХО. Это специализация для шаблонного класса.

U>вы можете сделать свой класс шаблонным

к сожалению — не подходит

U>если нужны выкрутасы с шаблонами, то скоро их вам здесь напишут профессионалы

очень на это надеюсь
Re: шаблон как параметр шаблона при специализации
От: night beast СССР  
Дата: 08.07.10 12:53
Оценка: 4 (2) +1
Здравствуйте, uaf, Вы писали:

uaf>Всем доброго времени суток.

uaf>Сломал голову пытясь параметризировать специализировать метод Rec::set (приведен упрощенный пример):

uaf>Хочется одним махом специализировать set для всех шаблонных класов Ett, что-то вроде:


uaf>
uaf>template <template <class> class E>
uaf>void Rec::set(const Ett<E>& rVal) {std::cout << "Obj";} // не проходит (
uaf>


uaf>Если кто силен в этом — подскажите, пожалуйста.


частичная специализация функций в плюсах не поддерживается

class Rec
{
public:
    Rec() {};

    template< typename T > struct setter {
        static void apply( const T & src ) {std::cout << "default";}
    };
    template <class T> void set(const T& rVal) { setter<T>::apply(rVal); }
};

template < typename T >
struct Rec::setter< Ett<T> > {
    static void apply( const Ett<T>& rVal ) {std::cout << "Ett";}
};


uaf>Спасибо.
Re[2]: шаблон как параметр шаблона при специализации
От: uaf  
Дата: 08.07.10 13:03
Оценка:
NB>частичная специализация функций в плюсах не поддерживается
неужели это — частичная специализация?... еще раз почитаю базу...

NB>
NB>class Rec
NB>{
NB>public:
NB>    Rec() {};

NB>    template< typename T > struct setter {
NB>        static void apply( const T & src ) {std::cout << "default";}
NB>    };
NB>    template <class T> void set(const T& rVal) { setter<T>::apply(rVal); }
NB>};

NB>template < typename T >
NB>struct Rec::setter< Ett<T> > {
NB>    static void apply( const Ett<T>& rVal ) {std::cout << "Ett";}
NB>};
NB>


Здорово, спасибо за идею.
Re[2]: шаблон как параметр шаблона при специализации
От: uaf  
Дата: 08.07.10 13:08
Оценка:
Здравствуйте, посетитель /life/, Вы писали:

ПL>Можно в класс Rec добавить перегруженный метод, если это допустимо


Rec — библиотечный класс, а Ett Obj1 Obj2 и прочие Obj объявляются отдельно, после. При их объявлении и должен специализироваться метод set...
Re: шаблон как параметр шаблона при специализации
От: Artifact  
Дата: 08.07.10 13:12
Оценка:
Здравствуйте, uaf, Вы писали:

uaf>Если кто силен в этом — подскажите, пожалуйста.

uaf>Спасибо.

template <class Obj>
class Ett {};

class Rec
{
public:
    Rec() {};
    template <class T> void set(const T& rVal) {std::cout << "default";}
    template <class T> void set(const Ett<T>& rVal);
};

// таких классов будет много
class Obj1 {};
class Obj2 {};


template <class T>
void Rec::set(const Ett<T>& rVal) {std::cout << "Obj";}

int main(int argc, char* argv[])
{
    Rec rec;

    Ett<Obj1> eo1;
    Ett<Obj2> eo2;

    rec.set(eo1);
    rec.set(eo2);
    return 0;
}
__________________________________
Не ври себе.
Re[2]: шаблон как параметр шаблона при специализации
От: uaf  
Дата: 08.07.10 13:22
Оценка:
в том то и дело, что это объявление

A>
A>template <class Obj>
A>class Ett {};
A>


появляется ПОСЛЕ Rec...
Re[3]: шаблон как параметр шаблона при специализации
От: Artifact  
Дата: 08.07.10 13:35
Оценка:
Здравствуйте, uaf, Вы писали:

uaf>в том то и дело, что это объявление


A>>
A>>template <class Obj>
A>>class Ett {};
A>>


uaf>появляется ПОСЛЕ Rec...

class Rec
{
public:
    Rec() {};
    template <class T> void set(const T& rVal) {std::cout << "default";}
};

template <class Obj>
class Ett {};

template <class T>
void rec_set(Rec& r, const T& rVal) { r.set(rVal); }

template <class T>
void rec_set(Rec&, const Ett<T>& rVal) { std::cout << "Obj"; }

// таких классов будет много
class Obj1 {};
class Obj2 {};

int main(int argc, char* argv[])
{
    Rec rec;

    Ett<Obj1> eo1;
    Ett<Obj2> eo2;

    rec_set(rec, 1); // default
    rec_set(rec, eo1);
    rec_set(rec, eo2);
    return 0;
}
__________________________________
Не ври себе.
Re[4]: шаблон как параметр шаблона при специализации
От: uaf  
Дата: 08.07.10 13:47
Оценка:
Здравствуйте, Artifact, Вы писали:

A>
A>template <class T>
A>void rec_set(Rec& r, const T& rVal) { r.set(rVal); }

A>template <class T>
A>void rec_set(Rec&, const Ett<T>& rVal) { std::cout << "Obj"; }
A>


спасибо, тоже вариант.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.