Есть ли частичная специализация для метода класса шаблона?
template <class A, class B>
class C
{
void foo();
}
не получится специализировать его вот так:
template <class A> void C<A, CObject>::foo() {};
Любая помощь?
Есть ли частичная специализация для метода класса шаблона?
template <class A, class B>
class C
{
void foo();
}
не получится специализировать его вот так:
template <class A> void C<A, CObject>::foo() {};
Любая помощь?
Если у вас уже есть специализированный класс, вы можете дать другую реализацию foo
в специализированном классе:
template<typename A, typename B>
class C
{
public:
void foo() { cout << "default" << endl; };
};
template<typename A>
class C<A, CObject>
{
public:
void foo() { cout << "CObject" << endl; };
};
Чтобы специализировать функцию-член в Visual C ++ 2008, вы также можете сделать ее шаблоном:
template<typename A, typename B>
class C
{
template<typename T>
void foo();
template<>
void foo<CObject>();
};
Похоже, что приведенное выше решение будет доступно только в будущем стандарте C ++ (согласно проекту n2914 14.6.5.3/2).
template<typename A, typename B> template<> void C<A, B>::foo<CObject>() { }
, потому что, хотя шаблон функции-члена является специализированным, внешний еще не является. Вы могли бы сделать наоборот template<> template<typename T> void C<int, bool>::foo() { }
, но я подозреваю, что он не этого хочет -.-
- person Johannes Schaub - litb; 08.10.2009
14.6.5.3/2
в черновике c ++ 0x является частичной специализацией. Для частичных специализаций этих ограничений нет. Их можно поместить в область действия класса - уже в C ++ 03. Но в вашем случае вы явно специализируете шаблон функции. Если бы они сделали это в своем примере, это тоже было бы незаконным: template<class T> struct A { template<class T2> struct B {}; template<> struct B<int*> {}; };
. Отчет о проблеме есть на open-std.org/ jtc1 / sc22 / wg21 / docs / cwg_closed.html # 727 с просьбой снять это ограничение (что, конечно, я тоже приветствую)
- person Johannes Schaub - litb; 08.10.2009
Думаю, тут недоразумение.
Есть два вида шаблонов:
В вашем примере у вас есть класс шаблона, который, конечно, содержит некоторые методы. В этом случае вам придется специализироваться на классе.
template <class A>
class C<A,CObject>
{
void foo() { ... } // specialized code
};
Проблема в вашем примере относительно проста: вы определяете метод foo для специализации C, но эта специализация никогда не была объявлена заранее.
Проблема здесь в том, что вам нужно полностью специализировать свой класс C (и, таким образом, копировать много данных). Есть несколько обходных путей.
Что в коде дает:
// 1- Inheritance
template <class A, class B>
class CBase
{
// Everything that does not require specialization
};
template <class A, class B>
class C: public CBase<A,B>
// depending on your need, consider using another inheritance
// or even better, composition
{
void foo(); // generic
};
template <class A>
class C<A,CObject> : public CBase<A,CObject>
{
void foo(); // specialized
};
// 2- Friend
// note the change in signature:
// - now you need to pass the attributes to be changed
// - the last parameter helps differentiating the overload
// as there is no specialization for functions
template <class A, class B> void foo(Arg1&, Arg2&, const B&);
template <class A> void foo(Arg1&, Arg2&, const CObject&);
template <class A, class B>
class C
{
friend template <class, class> foo;
};
// 3- Delegation
// same signature as foo in (2)
template <class A, class B> void bar(Arg1&, Arg2&, const B&);
template <class A> void bar(Arg1&, Arg2&, const CObject&);
template <class A, class B>
class C
{
void foo() { bar(member1, member2, B()); }
};
Надеюсь, это прояснит и поможет!
Нет, частичная специализация шаблона функции в C ++ 0x не подлежит добавлению.
Как правильно сказано выше, в отношении шаблонов функций в основном было сделано 2 вещи:
Как и раньше, следует использовать обходные пути для «имитации» частичной специализации шаблонов функций.
Поскольку класс является шаблоном, вам необходимо специализироваться на этом:
template <class A>
class C<A, CObject>
{
void foo() { ... }
}
Если я правильно помню, вы не можете сделать частичную специализацию шаблонов для функций. Не уверен, включен ли он в C ++ 0X
Обновление: (Ожидает подтверждения) Как отмечалось в комментариях, в C ++ 0X возможна частичная шаблонная специализация функций.