是否有一个模板类方法的局部特殊化?
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添加。
正如上面提到的正确,关于函数模板基本上2个事做完了:
所以像以前一样,解决方法应采用“模拟”部分函数模板专业化。
由于类是模板,你需要专注的是:
template <class A>
class C<A, CObject>
{
void foo() { ... }
}
如果我没有记错,你无法对功能模板偏特。 它不知道是否包括在C ++ 0X
更新:(等待确认) 作为评价指出的,功能模板偏特能够在C ++ 0X。