Re: Можно сделать частичную специализацию членов шаблона кла
От: Faust Россия  
Дата: 20.12.09 23:45
Оценка:
Здравствуйте, Zzealot, Вы писали:

Z>Вопрос такой — есть ли какой-то способ при создании специализации шаблона класса (полной или частичной — неважно) описывать (definition) не все члены класса, а только те, которые меняются по отношению к первичному шаблону ?

Z>Смотрел примеры в книгах — класс переписывают целиком — это ведь куча лишней работы ! А если мне требуется специализировать (модифицировать) только один из десяти методов класса ?
Z>В стандарте ISO 14882-2003 (действующий стандарт С++) в разделе 14.7.3 (Explicit specialization) описывается синтаксис специализации отдельных членов класса:

Z>template<class T1> class A {

Z>template<class T2> class B {
Z>template<class T3> void mf1(T3);
Z>void mf2();
Z>};
Z>};

Z>template<> template<class X>

Z>class A<int>::B { };
Z>template<> template<> template<class T>
Z>void A<int>::B<double>::mf1(T t) { } //
Z>// Здесь компайлер выдает ошибку: error C2039: 'mf1' : is not a member of 'A<T1>::B<X>'

Z>Вместе с тем, на одном из сайтов

Z>http://www.codersource.net/cpp_class_templates_specialization.html
Z>прочитал, что если шаблон специализирован для какого-то типа, то все его члены должны быть описаны с использованием этого типа.

Z>И чем глубже копаю, тем темнее становиться. Хотелось бы услышать мнение уважаемой общественности по этому вопросу.


Z>Рукавишников Дмитрий aka Zzealot

template <typename T, typename FooType>
struct test
{
    int                        Foo(void)
    { return SpecFoo<FooType>(); }
private:
    template <typename U>
    int                        SpecFoo(void)
    { return 0; }
    template <>
    int                        SpecFoo<int>(void)
    { return 4; }
    template <>
    int                        SpecFoo<double>(void)
    { return 8; }
};

    test<bool, bool>        Test0;
    Test0.Foo();// 0
    test<bool, int>            Test1;
    Test0.Foo();// 4
    test<bool, double>        Test2;
    Test0.Foo();// 8
Мой компьютер прогоняет бесконечный цикл за 9 секунд, но, мне кажется, он мог бы сделать это быстрее...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.