模板类方法是否有部分专业化?
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 <class A>
class C<A,CObject>
{
void foo() { ... } // specialized code
};
您的示例中的问题相对简单:您为专业化 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()); }
};
希望它澄清,并有所帮助!
不,没有要添加的 C++0x 中的偏函数模板特化。
正如上面正确提到的,关于功能模板,基本上做了两件事:
所以和以前一样,应该使用变通方法来“模拟”部分函数模板的专门化。
由于类是模板,因此您需要专门化:
template <class A>
class C<A, CObject>
{
void foo() { ... }
}
如果我没记错的话,你不能对函数进行部分模板特化。不确定它是否包含在 C++0X 中
更新:(
等待确认)如评论中所述,在 C++0X 中可以对函数进行部分模板特化。