fay*_*aya 11 c++ templates partial-classes
模板类方法是否有部分特化?
template <class A, class B>
class C
{
void foo();
}
Run Code Online (Sandbox Code Playgroud)
它不像这样专门化它:
template <class A> void C<A, CObject>::foo() {};
Run Code Online (Sandbox Code Playgroud)
有帮助吗?
Kir*_*sky 12
如果您已经有专门的类,您可以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; };
};
Run Code Online (Sandbox Code Playgroud)
要在Visual C++ 2008中专门化成员函数,您也可以将其设为模板:
template<typename A, typename B>
class C
{
template<typename T>
void foo();
template<>
void foo<CObject>();
};
Run Code Online (Sandbox Code Playgroud)
上述解决方案似乎只能在未来的C++标准中使用(根据草案n2914 14.6.5.3/2).
我认为那里存在误解.
有两种模板:
在您的示例中,您有一个模板类,当然包含一些方法.在这种情况下,您将必须专门化该类.
template <class A>
class C<A,CObject>
{
void foo() { ... } // specialized code
};
Run Code Online (Sandbox Code Playgroud)
您的示例中的问题相对简单:您为特化C 定义方法foo,但此特化从未事先声明过.
这里的问题是你必须完全专门化你的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()); }
};
Run Code Online (Sandbox Code Playgroud)
希望它澄清,并帮助!
归档时间: |
|
查看次数: |
9641 次 |
最近记录: |