Здравствуйте, 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 секунд, но, мне кажется, он мог бы сделать это быстрее...