我正在重构一些代码,明确地使用两个模板参数专门化一个类模板的成员函数。
template <class S, class T>
class Foo
{
void bar();
};
template <class S, class T>
void Foo<S, T>::bar()
{ /* Generic stuff */ }
template <>
void Foo<SomeType, SomeType>::bar()
{ /* Some special function */ }
现在我添加了一些模板参数,所以这个类现在看起来像这样:
template <class S, class EXTRA0, class T, class EXTRA1>
class Foo
{
void bar();
};
这两个额外的参数只是将typedef添加到我的类中,因此运行时功能并没有真正改变。有什么方法可以保持(现在部分)专门的bar实现吗?我似乎无法弄清楚它的语法,我预感到这可能是不可能的。
修改:我正在寻找类似的内容:
template <class EXTRA0, class EXTRA1>
void foo<SomeType, EXTRA0, Sometype, EXTRA1>::bar()
{
/* specialized implementation */
}
似乎没有编译..
答案 0 :(得分:3)
你是对的,这是不可能的。
您可以做的是在新Foo
内创建一个帮助成员类模板,并将专用函数作为非模板成员函数放在其中。专门化辅助类而不是函数。
另一种方法是将专业化转变为非模板重载。
答案 1 :(得分:1)
我不认为你想要的就是那么容易。这样的事情怎么样:
template <class S, class EXTRA0, class T, class EXTRA1>
class FooBase
{
void bar();
};
template <class S, class EXTRA0, class T, class EXTRA1>
void FooBase<S, EXTRA0, T, EXTRA1>::bar()
{ /* Generic stuff */ }
template <class S, class EXTRA0, class T, class EXTRA1>
class Foo
: public FooBase <S, EXTRA0, T, EXTRA1>
{ };
template <class EXTRA0, class EXTRA1>
class Foo<int, EXTRA0, int, EXTRA1>
: public FooBase <int, EXTRA0, int, EXTRA1>
{
void bar ();
};
template <class EXTRA0, class EXTRA1>
void Foo<int, EXTRA0, int, EXTRA1>::bar()
{ /* Some special function */ }
答案 2 :(得分:1)
您可以创建Base类,您可以在其中定义除bar()之外的所有成员,然后创建派生类(一个用于通用目的,一个用于SomeType):
template <class S, class T>
class FooBase
{
// All other members
};
template <class S, class EXTRA0, class T, class EXTRA1>
class Foo:public FooBase<S,T>
{
public:
void bar()
{
}
};
struct SomeType {};
template <class EXTRA0, class EXTRA1>
class Foo<SomeType,EXTRA0,SomeType,EXTRA1>:public FooBase<SomeType,SomeType>
{
public:
void bar()
{
}
};
int main()
{
Foo<SomeType,int,SomeType,int> b;
b.bar();
}
答案 3 :(得分:1)
您可以通过使用specialize仿函数代替函数来实现:
#include <iostream>
typedef int SomeType;
template <class A, class B>
class BarFunctor {
public:
void operator()() {
std::cout << "generic" << std::endl;
}
};
template <>
class BarFunctor<SomeType, SomeType> {
public:
void operator()() {
std::cout << "special" << std::endl;
}
};
template <class S, class T, class EXTRA0, class EXTRA1>
class Foo {
public:
void helloWorld() {
std::cout << "hello world !" << std::endl;
}
void bar() {
return _bar();
}
private:
BarFunctor<S, T> _bar;
};
int main() {
Foo<char, char, char, char> gen;
Foo<SomeType, SomeType, char, char> spe;
gen.helloWorld();
spe.helloWorld();
gen.bar();
spe.bar();
return 0;
}